1

我们正在对我们的游戏服务器堆栈进行负载测试,该堆栈由 haproxy/ssl -> node.js(应用服务器)-> 数据库组成

调用是获取,然后 node.js 将其传递给数据库,然后将数据返回给客户端,但是在各种测试期间,我们看到了各种我们似乎无法追踪的奇怪问题。

运行 tcpdump 'tcp[13] & 4!=0' | grep http-alt

我们在日志中看到了各种各样的东西:

23:35:16.049886 IP xx > xx.http-alt: Flags [R], seq 2946709660, win 0, length 0 23:35:16.668370 IP xx.62737 > xx.http-alt: Flags [R.], seq 4204676699, ack 3037703652, win 68, options [nop,nop,TS val 153103530 ecr 133109021], length 0 23:36:06.030500 IP xx.40290 > xx.http-alt: Flags [R.], seq 431162404, ack 2610577956, win 68, options [nop,nop,TS val 153115871 ecr 133121361], length 0

退出我们看到的命令

过滤器接收到 1662286 个数据包 9 个数据包被内核丢弃

我们的负载测试应用程序也将错误返回给我们.. 沿着这条线

T000023 --- loop started --- 19 Aug 2013 18:09:07.975 ---r" T000023r" T000023 <<< user_id = nullr" T000023 <<< ext_userid = nullr" T000023 <<< Public_token_put = nullr" T000023 <<< Private_token_prt = nullr" T000023 >>> execute plug-in #1: GenerateRandomCharactersr" T000023r" T000023r" T000023 # Page #1: Registrationr" T000023 # ---------------------r" T000023r" T000023 [1] GET https://someurl.com:2222/?method=somemethod&type=reg=somerandomid ...r" T000023 -8 (Network Connection aborted by Server), [No Content Type], --- bytes, --- ms, * Failed at 'Open Network Connection', java.net.SocketException: Connection resetr" T000023 error: expected HTTP status: 200 <> received: -8 (Network Connection aborted by Server), [No Content Type], --- bytes, --- ms, ** Failed at 'Open Network Connection', java.net.SocketException: Connection resetr

关于从哪里开始的任何想法..

服务器是 ubuntu 12.04 服务器,对 sysctl 进行了一次调整

net.netfilter.nf_conntrack_max = 262144

4

1 回答 1

2

tcpdump 错误是红色的(意味着它们与您的问题无关)。TCPDump 尽量避免影响系统性能。如果系统会因为 tcpdump 正在执行的操作而得到备份,那么它将简单地丢弃数据包而不是检查它。这并不意味着系统或网络堆栈正在丢弃数据包。尝试将“-n”开关添加到 tcpdump。

-n     Don't convert addresses (i.e.,  host  addresses,  port  numbers, etc.) to names.

除非您安装了像 dnsmasq 这样的缓存 DNS 服务器,否则 nscd 很可能被禁用。这意味着对于 tcpdump 中的每个连接都将尝试进行反向 dns 查找。我敢打赌,通过添加 -n 你的“丢弃的数据包”会消失。

在我看来,您真正的问题听起来像是您的系统资源不堪重负(cpu、内存等),或者您超出了 haproxy 中的临时端口/最大连接数。此外,有充分的证据表明 conntrack + haproxy 是导致糟糕性能的秘诀。

  1. 禁用连接跟踪
  2. 检查您在 haproxy 中的最大连接数配置
  3. 查看 haproxy stats 页面(如果未配置,请配置它 - 太棒了!)
  4. 启用 haproxy 日志记录。我使用版本 1.5.19 运行了一个非常大的 haproxy 实现。我们已经使用 1.5.x 快一年了,没有任何问题。我了解到的一件事是 haproxy 日志记录始终是 100% 可靠的。有时我误解了日志条目,但它总是准确的。在这种情况下,您试图追踪连接问题,haproxy 日志只会告诉您失败的原因。
  5. 检查 haproxy 进程的最大打开文件句柄。去做这个

cat /proc/(haproxy PID)/limits

祝你好运。

PS。启用统计页面,太棒了!另外,启用 haproxy 日志记录,它也很棒!在这两者之间,您将能够非常快速地识别连接问题。

于 2013-08-20T13:29:40.803 回答