记一次入门级别的并发试验过程(暂时放弃)

环境:

a服务器使用curl_multi执行3000,4000,5000并发,访问b服务器一个静态html文件

 

问题:3000,4000并发基本稳定,5000并发时,有时候全部成功,有时候Recv failure: Connection reset by peer错误

 

需要解决:让5000并发成功率能够稳定

 

原因定位:出现改问题,是服务端发送了RST的tcp,其中win=0,客户端不再发包

 

两种猜测:1 tcp连接数上限被拒绝(然而并不是,这些tcp的三次握手都已经完成并且发送了http请求)  2内存不够处理请求,所以服务端发送了win=0的rst包(目前比较有这个可能)

 

最后:暂时放弃试验,性能优化这块,内容太多了,涉及网络(tcp),cpu,内存(tcp使用的内存,程序使用的内存,php-fpm内存等等),服务器的配置优化。。。。我晕了

 

 

学到:

  1 php-fpm不会释放内存(导致执行curl_multi的服务器内存飙高宕机,每次top查看剩余内存,不够就要重启php-fpm),而且貌似是轮询调用php-fpm

  2 可以使用curl_multi执行并发请求

  3 可以使用popen代替exec同时打开多个进程(相当于并发执行某些命令)

  4 windows使用wireshark抓包,linux使用tcpdump抓包,常用 tcpdump -i eht1 src host xxx or dst host xxx -w filename

  5 使用netstat查看网络连接,和tcp迁移状态 netstat -lan|grep xxx.

    状态主要有sync_send,ESTABLISHED,

    fin_wait1(主动发送fin的一方等待ack响应前进入状态),

    fin_wait2(主动发送fin的一方,接到ack响应后,等待对方的fin前的状态),

    time_wait(主动发送fin一方收到对方fin并发送了ack确认后要断开之前进入的状态)

  7 cat /prox/net/scokstat 查看linux当前socket连接整体状态

  8 查看有关socket的配置,比如tcp的接受缓冲区cat /proc/sys/net/ipv4/tcp_rmem

  

 

 

   卧槽,,好像没了,搞了几天,难道就学会这些?反思反思。。

 

  余留问题: 服务器发送RST导致了Recv failure: Connection reset by peer,1 不知道为啥发送RST?2 不知道如何改正

posted @ 2016-08-23 16:03  穿着草鞋上高地  阅读(198)  评论(0编辑  收藏  举报