我们已经有一个用于不同客户端的设置:一个连接到本地网络上的 Firebird 服务器的程序。
到目前为止,我们主要使用运行 Ubuntu LTS(最近升级到 10.04)的 32 位处理器。
现在我们介绍运行在64位处理器上的服务器,运行64位Ubuntu 10.04。
突然间,一些查询的运行速度比以前慢了。
简而言之:在 64 位和 32 位服务器上本地运行查询都可以正常工作,但是当通过网络运行相同的查询时,64 位服务器的速度突然变得慢得多。
我们对 64 位和 32 位服务器的本地和远程连接进行了一些检查,使用相同的数据库和相同的查询,在 Flamerobin 中运行。
在本地运行查询所需的时间可以忽略不计:64 位服务器上为 0.008 秒,32 位服务器上为 0.014 秒。因此服务器本身运行良好。
通过网络运行查询,64 位服务器突然需要长达 0.160 秒才能响应,而 32 位服务器则需要 0.055 秒才能响应。
因此,尽管新服务器在本地运行时速度要快两倍,但旧服务器在网络上的速度要快两倍。
除此以外,设置都相同。所有服务器都运行相同的 Ubuntu 10.04 安装、相同版本的 Firebird 等等,唯一的区别是有些是 64 位,有些是 32 位。
任何想法??
我尝试用谷歌搜索,但没有找到任何关于 Firebird 64 位比 Firebird 32 位慢的抱怨,除非 Firebird 2.1 更改日志提到有一个新的网络 API,只要更新驱动程序以使用它,它的速度就会快两倍。
因此我可以想象 64 位驱动程序仍在使用旧的 API,但我想这有点牵强。
提前感谢任何回复!:)
答案1
64 位服务器上的其他网络事务是否很慢?可能是因为网络驱动程序有问题或过时。
答案2
确保新旧服务器上的以下事项
检查新旧服务器上的窗口缩放
连接的读写缓冲区
缓冲区的大小可以根据需要进行调整
root@x:~# sysctl -A | grep net | grep mem
检查这些变量
这些指定内核中所有网络连接的最大默认内存缓冲区使用量
net.core.wmem_max = 131071 net.core.rmem_max = 131071 net.core.wmem_default = 126976 net.core.rmem_default = 126976
这些指定特定于 TCP 连接的缓冲内存使用情况
net.ipv4.tcp_mem = 378528 504704 757056 net.ipv4.tcp_wmem = 4096 16384 4194304 net.ipv4.tcp_rmem = 4096 87380 4194304
指定的三个值是“最小默认最大”缓冲区大小。因此,从 Linux 开始,将为每个连接使用读取和写入缓冲区的默认值。随着连接数量的增加,这些缓冲区将减少(最多直到指定的最小值)。最大缓冲区值的情况也是如此。
这些值可以使用这个设置
sysctl -w KEY=KEY VALUE
检查其他 tcp 网络参数
尝试这些
在旧服务器上
sysctl -a | grep ^net.ipv4 >s1
在新服务器上
sysctl -a | grep ^net.ipv4 >s2
现在对文件 s1 和 s2 进行差异比较(将 s2 复制到旧服务器之后
diff s1 s2
这将显示参数的差异
检查 iptables 的状态
iptables -L iptables -t nat -L
在两台服务器上
还要检查 selinux 的状态