我是一名软件工程师,两周以来一直在尝试在多服务器托管环境中检测(并尽可能解决)奇怪的本地网络问题。
我们从一家欧洲托管公司购买了 3 个专用盒子,配有 32GB 内存和 8 核 i7 CPU。每个盒子都有两个接口,一个用于外部流量,一个用于本地通信。然后我们聘请了一名系统工程师来设置我们的初始环境。多么美妙的世界。一切都很顺利,直到部署。在服务器上部署应用程序后,问题开始出现:
服务器 1(数据库):32 GB,8 核,2 个接口,仅运行 2 个服务:ubuntu 12.04 LTS 上的 mysql 5.5,带有 memcached 1.4.13-0ubuntu2
服务器 2 (www):32 GB,8 核,2 个接口,在 ubuntu 12.04 LTS 上运行 php5-fpm (v5.5)、nginx 1.4.4 和 crontab
服务器 3(Solr):32 GB,8 核,2 个接口,仅运行一项服务:在 ubuntu 12.04 LTS 上使用带有 Solr 4.5 的 Tomcat7,使用 memcached 1.4.13-0ubuntu2
部署后,我们发现应用程序的批量索引过程非常缓慢。批量索引时,应用程序从数据库(来自 srv1)读取数据(阶段中没有最终用户流量),处理数据并生成更多扩展数据,将新数据作为多个块缓存在 memcached(srv1)上并在 solr 上进行索引。我在应用程序方面花了 5-6 天以上的时间来查找任何可能的瓶颈或与应用程序相关的问题,但一无所获。
在服务器上运行我们的索引 cron 时,应用程序挂起、等待,有时会抛出与 memcached 相关的连接错误(未找到),但有时不会,成功通过读取阶段并抛出与 mysql 连接相关的另一个连接异常。Db 已启动并运行,mysql.log 中没有错误行。Memcached 已启动并运行,没有错误日志事件极其详细(-vvv)日志记录已打开。我一次又一次地检查应用程序,没有循环查询(查询经过充分优化),没有不必要的 memcached 连接 - 循环操作(我们在批量读取和写入时使用 multi_get - multi_set 方法)
然后我尝试切换应用程序配置,使用我们的外部 IP 地址 (120.144.XX),而不是使用本地 IP 地址 (10.10.XX),然后轰!应用程序开始飞速运行。问题和异常都消失了,运行起来像风一样完美。
我们的系统工程师对硬件/接线问题进行了深入研究,与数据中心进行了多次交流,进行了多次测试,但最终的结论是:“您的硬件和接线没有问题,请检查您的网络配置和应用程序。”
Sysengineer 在一次会议上告诉我“本地网络上的 -ipv6 配置是不必要的,所以我们可以完全关闭它”。我不知道为什么。在那次对话之后,我再也没有问任何问题。
几天后,我们公司又雇佣了一位讨厌 ipv6 的系统工程师,这让我很惊讶。我的第一个问题是,为什么这两个系统工程师都讨厌 ipv6?ipv6 的问题是什么?
我们的应用程序目前的主要问题是它使用外部 IP 地址与 memcached 和 mysql 通信,而我们想为此使用本地网络。它在外部 IP 上运行良好,但在本地 IP 上运行不佳。
我不知道问题出在哪里,我不是系统或网络工程师,我不知道他们在系统中做了什么,但我相信存在配置错误问题。两位系统工程师都否认没有问题,但我想进一步挖掘这一点。
我从哪里开始?什么是查找问题的适当工具?这些输出是否正常:
[email protected] ~ # ping6 google.com
PING google.com(fra02s20-in-x04.1e100.net) 56 data bytes
64 bytes from fra02s20-in-x04.1e100.net: icmp_seq=1 ttl=56 time=5.46 ms
64 bytes from fra02s20-in-x04.1e100.net: icmp_seq=2 ttl=56 time=5.43 ms
^C
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 5.432/5.447/5.462/0.015 ms
[email protected] ~ # ping6 10.10.10.3
unknown host
[email protected] ~ # ping6 10.10.10.1
unknown host
[email protected] ~ # ifconfig
eth0 Link encap:Ethernet HWaddr d4:3d:7e:ec:f0:11
inet addr:144.XX.XX.XX Bcast:144.XX.XX.XX Mask:255.255.255.224
inet6 addr: fe80::d63e:7efe:fedf:f011/64 Scope:Link
inet6 addr: 2c01:4e8:200:7343::2/64 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3523880 errors:0 dropped:0 overruns:0 frame:0
TX packets:7026713 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1042946956 (1.0 GB) TX bytes:9140153208 (9.1 GB)
eth0:1 Link encap:Ethernet HWaddr d4:3d:7e:ec:f0:11
inet addr:144.XX.XX.XXX Bcast:144.XX.XX.XX Mask:255.255.255.224
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
eth1 Link encap:Ethernet HWaddr 68:05:ca:06:68:a2
inet addr:10.10.10.4 Bcast:10.10.10.255 Mask:255.255.255.0
inet6 addr:fde80::6c05:caff:fe26:57a2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:47434 errors:0 dropped:986 overruns:0 frame:0
TX packets:364069 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7188468 (7.1 MB) TX bytes:527053731 (527.0 MB)
Interrupt:16 Memory:f7cc0000-f7ce0000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:4765 errors:0 dropped:0 overruns:0 frame:0
TX packets:4765 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:540280 (540.2 KB) TX bytes:540280 (540.2 KB)
我现在应该去哪里查找问题出在哪里?
编辑 我认为这些输出也很有趣:
[email protected] # netstat -s | egrep -i 'loss|retrans|drop'
1588 segments retransmited
63 times recovered from packet loss by selective acknowledgements
TCPLostRetransmit: 4
9 timeouts in loss state
375 fast retransmits
46 forward retransmits
519 retransmits in slow start
1 SACK retransmits failed
[email protected] # netstat -s | egrep -i 'loss|retrans|drop'
32 dropped because of missing route
2290 segments retransmited
2 SYNs to LISTEN sockets dropped
150 times recovered from packet loss by selective acknowledgements
TCPLostRetransmit: 5
4 timeouts in loss state
410 fast retransmits
85 forward retransmits
150 retransmits in slow start
12 SACK retransmits failed
这些输出真的正常吗?