性能测试总得有几个指标,左思右想,自己所开发涉及到的都是TCP长连接,无非就是心跳重连,着实不知道哪方面需要高性能,如果真要找个的话,我想应该还是连接数目。暂且研究学习下大并发,也就是服务器同时维护处理大量连接的状况,这里还是TCP长连接,至于web方面的,实际中没处理过,以后想学习的话再另行研究。

参考资料

https://blog.csdn.net/lijinqi1987/article/details/74545851 https://blog.csdn.net/yazhouren/article/details/51298252 http://blog.51cto.com/youerning/2089930?lb https://blog.csdn.net/dhhome2006/article/details/83789634

实践过程

浏览上面涉及得文章,按照最后一篇的步骤来实践。从文中学到,所谓的大并发,主要就是修改linux的相关的配置文件。为了在实践的过程中发现不修改文件会出现什么问题,所以并未按开始给定的修改方式修改配置。
在实践初期想的是,只有一台机器,所有的端口也只有65536个,怎么测试百万连接?再装n个虚拟机?实在不想再折腾那个,发现可以给网卡增加ip,经过用windows的命令窗口ping后发现确实可以连通,高兴坏了,这不是可以瞬间加上几十个IP,立马不就上百万连接了,自己加了5个ip从101到105,一个6w,30w连接测试下得了。后面又发现了screen,原来可以把每个都放在一个固定得屏幕里,还能恢复,就按这个来测试。现在一个myserver screen里面启动了server,然后在另一个myclient01 screen里面启动了客户端,分别设置连接数目为10,40,100,500,1000进行测试,发现1000就测试不过去,总是报错。然后就按前面得修改配置,继续测试,貌似好些,但是后面还是报错。这可咋整,连1000个连接都过不去,病急乱投医,我就把所有得screen都关闭,然后在secureCRT里面开了两个窗口,一个开服务器,一个开客户端,这次成功了,6w个连接。由于前面查看过连接得信息,发现两个连接得ip均为192.168.1.11,而并不是我认为设置得192.168.1.101,故而没再继续进行其他设置ip的测试,6w也不少了,虽然都是自己连接自己的。鉴于最后大并发没用screen测试,总觉得不爽,screen怎么可能对测试有影响,所以又使用screen进行了一次测试,没有出问题,6w连接成功。
以下为测试过程中输出或者查看的信息:

设置10连接测试 分别给出客户端和服务端显示信息,并给出成功建立连接信息,后面的测试不再给出成功连接信息,最后会给出一个统计数目
TCP-Cli:~$ 
 [I/O Threads] : 10 
 [I/O Sockets] : 10 
 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 
 [ ST Timers ] : 11 
 [ MM Timers ] : 0 
 [ HTBT Time ] : 200 
 [ HTBT Size ] : 2 

TCP-Svr:~$
 [I/O Threads] : 40
 [I/O Sockets] : 10
 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0
 [ ST Timers ] : 10
 [ MM Timers ] : 0
 [ HTBT Time ] : 200
 [ HTBT Size ] : 2

ss -anp | grep test | grep 3000

tcp    ESTAB      0      0      192.168.1.11:35103              192.168.1.11:3000                users:(("test_tcp_client",pid=15450,fd=43))
tcp    ESTAB      0      0      192.168.1.11:53167              192.168.1.11:3000                users:(("test_tcp_client",pid=15450,fd=46))
tcp    ESTAB      0      0      192.168.1.11:43920              192.168.1.11:3000                users:(("test_tcp_client",pid=15450,fd=45))
tcp    ESTAB      0      0      192.168.1.11:37562              192.168.1.11:3000                users:(("test_tcp_client",pid=15450,fd=38))
tcp    ESTAB      0      0      192.168.1.11:3000               192.168.1.11:52912               users:(("test_tcp_server",pid=15325,fd=131))
tcp    ESTAB      0      0      192.168.1.11:3000               192.168.1.11:53167               users:(("test_tcp_server",pid=15325,fd=138))
tcp    ESTAB      0      0      192.168.1.11:50075              192.168.1.11:3000                users:(("test_tcp_client",pid=15450,fd=37))
tcp    ESTAB      0      0      192.168.1.11:3000               192.168.1.11:41792               users:(("test_tcp_server",pid=15325,fd=134))
tcp    ESTAB      0      0      192.168.1.11:52912              192.168.1.11:3000                users:(("test_tcp_client",pid=15450,fd=39))
tcp    ESTAB      0      0      192.168.1.11:3000               192.168.1.11:51865               users:(("test_tcp_server",pid=15325,fd=133))
tcp    ESTAB      0      0      192.168.1.11:56946              192.168.1.11:3000                users:(("test_tcp_client",pid=15450,fd=40))
tcp    ESTAB      0      0      192.168.1.11:3000               192.168.1.11:37562               users:(("test_tcp_server",pid=15325,fd=130))
tcp    ESTAB      0      0      192.168.1.11:3000               192.168.1.11:56946               users:(("test_tcp_server",pid=15325,fd=132))
tcp    ESTAB      0      0      192.168.1.11:3000               192.168.1.11:50075               users:(("test_tcp_server",pid=15325,fd=129))
tcp    ESTAB      0      0      192.168.1.11:3000               192.168.1.11:56519               users:(("test_tcp_server",pid=15325,fd=136))
tcp    ESTAB      0      0      192.168.1.11:3000               192.168.1.11:35103               users:(("test_tcp_server",pid=15325,fd=135))
tcp    ESTAB      0      0      192.168.1.11:51865              192.168.1.11:3000                users:(("test_tcp_client",pid=15450,fd=41))
tcp    ESTAB      0      0      192.168.1.11:41792              192.168.1.11:3000                users:(("test_tcp_client",pid=15450,fd=42))
tcp    ESTAB      0      0      192.168.1.11:3000               192.168.1.11:43920               users:(("test_tcp_server",pid=15325,fd=137))
tcp    ESTAB      0      0      192.168.1.11:56519              192.168.1.11:3000                users:(("test_tcp_client",pid=15450,fd=44))

设置40连接测试
TCP-Cli:~$
 [I/O Threads] : 10
 [I/O Sockets] : 40
 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4
 [ ST Timers ] : 41
 [ MM Timers ] : 0
 [ HTBT Time ] : 200
 [ HTBT Size ] : 2

 TCP-Svr:~$ 
 [I/O Threads] : 40 
 [I/O Sockets] : 40 
 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 
 [ ST Timers ] : 40 
 [ MM Timers ] : 0 
 [ HTBT Time ] : 200 
 [ HTBT Size ] : 2 

设置100连接测试
 TCP-Cli:~$ 
 [I/O Threads] : 10 
 [I/O Sockets] : 100 
 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 
 [ ST Timers ] : 101 
 [ MM Timers ] : 0 
 [ HTBT Time ] : 200 
 [ HTBT Size ] : 2 

 TCP-Svr:~$ 
 [I/O Threads] : 40 
 [I/O Sockets] : 100 
 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 
 [ ST Timers ] : 100 
 [ MM Timers ] : 0 
 [ HTBT Time ] : 200 
 [ HTBT Size ] : 2 

设置500连接测试
 TCP-Cli:~$ 
 [I/O Threads] : 10 
 [I/O Sockets] : 500 
 50 + 50 + 50 + 50 + 50 + 50 + 50 + 50 + 50 + 50 
 [ ST Timers ] : 501 
 [ MM Timers ] : 0 
 [ HTBT Time ] : 200 
 [ HTBT Size ] : 2 

 TCP-Svr:~$ 
 [I/O Threads] : 40 
 [I/O Sockets] : 500 
 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 
 [ ST Timers ] : 500 
 [ MM Timers ] : 0 
 [ HTBT Time ] : 200 
 [ HTBT Size ] : 2 

ss -anp | grep test | grep 3000 | wc -l
1002

设置1000连接测试,测试失败,以下为输出信息
 CTest::OnConnectError(server : 192.168.1.11:3000) 

 CTest::OnConnectError(server : 192.168.1.11:3000) 

 CTest::OnConnectError(server : 192.168.1.11:3000) 

 CTest::OnConnectError(server : 192.168.1.11:3000) 

修改linux配置后,设置60000连接测试
TCP-Cli:~$
 [I/O Threads] : 10
 [I/O Sockets] : 60000
 6000 + 6000 + 6000 + 6000 + 6000 + 6000 + 6000 + 6000 + 6000 + 6000
 [ ST Timers ] : 60001
 [ MM Timers ] : 0
 [ HTBT Time ] : 200
 [ HTBT Size ] : 2

TCP-Svr:~$
 [I/O Threads] : 40
 [I/O Sockets] : 60000
 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500 + 1500
 [ ST Timers ] : 60000
 [ MM Timers ] : 0
 [ HTBT Time ] : 200
 [ HTBT Size ] : 2

ss -anp | grep test | grep 3000 | wc -l
120002

top查看资源消耗情况
PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                               
15759 root      20   0  865628 202968   1464 S  7.7  5.2   0:14.13 test_tcp_server                                                                                                       
15833 root      20   0  835028 203260   1300 S  7.3  5.2   0:09.95 test_tcp_client

过一段时间再次top查看资源消耗情况
PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                               
15759 root      20   0  865628 203008   1464 S  4.7  5.2   0:37.91 test_tcp_server                                                                                                       
15833 root      20   0  835028 205256   1300 S  4.7  5.3   0:33.86 test_tcp_client  

知识及问题

在虚拟机中给网卡添加删除ip,我先添加,通过ping发现是成功的,然后再添加相同的,按照设想肯定添加不成功,然后再删除。

/sbin/ifcfg enp0s3 add 192.168.1.99
RTNETLINK answers: File exists
/sbin/ifcfg: line 18: killall: command not found

/sbin/ifcfg enp0s3 add 192.168.1.99
RTNETLINK answers: File exists
Error: failed to add 192.168.1.99/24 on enp0s3.

/sbin/ifcfg enp0s3 del 192.168.1.99
/sbin/ifcfg: line 18: killall: command not found

注意到前面添加删除有报出问题,使用下面命令安装killall,File exists那个我没有处理。

yum install psmisc

在外部访问CentOS中部署应用时,需要关闭防火墙。
关闭防火墙命令:systemctl stop firewalld.service
开启防火墙:systemctl start firewalld.service
关闭开机自启动:systemctl disable firewalld.service
开启开机启动:systemctl enable firewalld.service

查看线程
1。 使用top命令,具体用法是 top -H
加上这个选项,top的每一行就不是显示一个进程,而是一个线程。

2。 使用ps命令,具体用法是 ps -xH
这样可以查看所有存在的线程,也可以使用grep作进一步的过滤。

3。 使用ps命令,具体用法是 ps -mq PID
这样可以看到指定的进程产生的线程数目。

总结

高并发,主要是修改linux配置的问题,这样服务器就可以拥有百万,千万的连接。从我最后top的结果可以看出,所谓的并发数目,也只是跟内存有关而已,毕竟一个连接也就一个客户端服务器的ip端口4元组,按6w连接5%计算,显然我的机器能承载120w的连接数目。这显然不是我要研究的高并发,也无所谓,知道一点总比一点都不知道强。从测试结果看出是高并发的,它怎么实现的?从打印信息来看,主要就是一个线程池,每个线程里面会有平均分配的socket数目,那么这样也就给我指出了下一步查看的关键,也就是高并发里面老生常谈的IO复用,我要研究的点应该在这里,肯定能在后面的fpnn和Mars里面找到答案。多查多想多读多看多写多练,高并发估计也没什么。如果要想真正精通网络,必须把linux内核里面网络方面的东西研究透才行,这就难了。