记一次入门级别的并发试验过程(暂时放弃)
环境:
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 不知道如何改正