最近完成了一个服务器框架, 于是测试的他的qps,发现了一个奇怪的问题,测试出来qps只有3w/s,与前面说的10w/s,有很大的差距。使用trace命令打印出glibc函数调用信息,发现了大部分的时间程序处于锁等待状态,我开始怀疑认为是内部使用锁占用太多时间。于是乎改为无锁队列。(关于无锁队列已经记录).修改完毕后,发现了如下几个问题:
1:业务处理线程消耗大量的CPU时间,因为采用了轮询,一直空跑CPU。
2:使用了无锁队列并没有提升qps。
这让不仅陷入了沉思,使用ifstat命令,查看网络流量包,如图:
流量上不去,怀疑是网络带宽问题,局域网内100Mbps,换算单位为12.5m/s,通过文件拷贝测试,不是贷款问题,难道是机器问题。于是乎对测试服务器和本地机器进行比较,
使用lscpu命令查看,配置基本相同。于是跑到远程测试服务器上面去测试,发现qps可以达到10w/s,这下子我更加郁闷了,搜寻了一个下午,还是我的同事提醒了我,网卡不同,使用cat /proc/interrupts 查看中断响应分布,如图:
网卡中断响应分布在一个CPU中,在看看测试服务器的信息:
eth1-TxRx-0是神马意思,百度了一下,叫做网络多队列。这里有8个队列,网络软中断均匀的分布8核中。
原因:
因为测试qps属于IO密集型,这样网卡就会频繁产生网络软中断,但是在本地机器上面没有网卡多队列,使得CPU0的si时间占用到%100,缓冲区满,出现丢包问题,这样ifstat流量根本上不去,那么进程会处于阻塞等待状态。这也是我本地进程CPU占有率上不去的原因,而多队列网卡可以将信号中断分散多个CPU(中断由IRQBlance进行负载均衡)。
结果:
问题得到解决。