我在连接到自定义数据库服务器的(通常)延迟绑定的桌面Java应用程序中遇到问题。
当它在远程主机(Windows XP)上工作时,速度很快(大的表单在2秒内打开)。 当它运行在同一台主机上时,数据库处于打开状态(使用X11vnc和NX),速度非常慢(在20秒内打开相同的表单)。 服务器正在运行SuSE Linux Enterprise Server 10。
我检查了什么:
iptables是干净的(没有规则在filter , raw , mangle或nat ,ACCEPT上的所有表) tc是干净的 netcattesting) 在看atop时候,似乎没有任何瓶颈:
远程和本地运行之间唯一不同的是networking利用率,而本地进程以大约1200kbps的速率提取数据,远程站点以大约15Mbps的速度进行。
我目前正在努力重复我的硬件的问题,所以这些线上的任何提示也是受欢迎的。
编辑:改变从默认的16K的lo接口MTU到1500解决了这个问题。 这个问题在Debain lenny 64bit上被重复了。
我所得到的只是更多的debugging思路,没有特定的顺序。
tcpdump -i lo ,它可能有助于找出是否有一个明显的模式传输的数据包。 echo 1 > /proc/sys/net/ipv4/tcp_low_latency 这听起来很奇怪,但是前一阵子对我来说很奏效。
检查/ etc / hosts文件以使您的主机名与localhost一致,或者添加一个指向127.0.0.1或一个监听的。
为了消除X11vnc和NX作为延迟的可能原因,我会编写一个控制台模式的非GUI Javatesting程序,执行数据库查找或testing交易和时间,在PC上和服务器上运行的应用程序(例如使用SSH / Putty调用它)。
很长一段时间:如果JDBC驱动程序正在使用(例如,用于日志logging),如果DNSconfiguration不正确,软件可能会挂起等待DNSparsing超时,我也会检查反向DNSparsing。 在Java应用程序中如何configurationDBMS位置?
你有没有尝试连接到127.0.0.1而不是本地主机? 这有几件事情。 避免疯狂的DNS问题是其中之一,但也有很多客户端看到“本地主机”,然后决定不使用networking,而是使用一些本地套接字。 这可能是这个自动技术开关,正在杀死你的应用程序。 几个程序做这个主要的像mysql一样。 通过IP使用本地主机环回地址迫使他们实际使用networking套接字。
我最喜欢的工具是像这样的问题。 你可以简单地对客户端进行压缩,并在做一些事情(阻塞调用,如连接或读取)之后暂停。 如果有某种事件循环模糊了暂停,您可以尝试将这些系统调用过滤出来,或者可以打开计时选项以将整个输出保存在文件中。 另一个诀窍就是等到它“结束”,不pipe是什么东西,然后打到^ C,所以你可以看看发生了什么事情,把它从昏迷中解脱出来。
原来是应用程序中的一个错误。 对于小型MTU,TCP将数据包分割并且不会暴露该错误。 回环上的MTU高,这个错误就performance出来了。