源自《LInux高性能服务器编程》- 游双
高并发计算服务器数量
每秒查询率QPS:对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,即每秒请求数,即最大谈吐能力。
并发数:并发数和QPS是不同的概念,一般说QPS会说多少并发用户下QPS,当QPS相同时,并发用户数越大,网站并发处理能力越好。当并发用户数过大时,会造成进程(线程)频繁切换,反正真正用于处理请求的时间变少,每秒能够处理的请求数反而变少,同时用户的请求等待时间也会变大。 找到最佳线程数能够让web系统更稳定,效率更高。
指令使用
ps
ps -ef | grep 命令详解
ps 命令的作用是显示进程信息的。
如ps -ef | grep Server
显示Server进程的信息。
系统检测工具
mpstat
mpstat(multi-processer statistics),它能实时检测多处理器系统上每个CPU的使用情况。
%usr:除了nice值为负的进程,系统上其他进程运行在用户空间的时间占CPU总运行时间的比例。
%sys:系统上所有进程运行在内核空间的时间占CPU总运行时间的比例,但不包括硬件和软件中断消耗的CPU时间。
%idle:系统空闲的时间占CPU总运行时间的比例。
以上三个字段基本上反映了代码中业务逻辑代码和系统调用所占的比例,以及系统还能承受多大的负载。
(Nice值是类UNIX操作系统中表示静态优先级的数值。每个进程都有自己的静态优先级,优先级高的进程得以优先运行。
Nice值的范围是-20~+19,拥有Nice值越大的进程的实际优先级越小(即Nice值为+19的进程优先级最小,为-20的进程优先级最大),默认的Nice值是0。由于Nice值是静态优先级,所以一经设定,就不会再被内核修改,直到被重新设定。Nice值只起干预CPU时间分配的作用,实际中的细节,由动态优先级决定。
“Nice值”这个名称来自英文单词nice,意思为友好。Nice值越高,这个进程越“友好”,就会让给其他进程越多的时间。)
iostat
iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。
Linux IO实时监控iostat命令详解
ifstat
ifstat(interface statistics)是一个简单的网络流量检测工具。
vmstat
vmstat(virtual memory statistics)能实时输出系统的各种资源的使用情况,比如进程信息、内存使用、CPU使用率以及I/O使用情况。
netstat
netstat是一个功能很强大的网络信息统计工具。
如netstat -t | grep 127.0.0.1:9006
查看指定IP:PORT
的TCP连接状态。
strace
strace是测试服务器性能的重要工具。它跟踪程序运行过程中执行的系统调用和接收到的信号,并将系统调用名、参数、返回值及信号名输出到标准输出或者指定的文件。
nc
nc(netcat)主要被用来快速构建网络连接。我们可以让它以服务器的方式运行,监听某个端口并接收客户连接,因此它可以用来调试客户端程序。我们也可以使之以客户端方式运行,向服务端发起连接并收发数据,因此它可以用来调试服务器程序,此时它有点像telnet程序。
如nc -C 127.0.0.1 9006
连接服务器。
lsof
lsof(list open file)是一个列出当前系统打开的文件描述符的工具。
tcpdump
tcpdump是一款经典的网络抓包工具。
服务器调制、调试和测试
压力测试(webbench)
webbench原理
【源码剖析】Webbench —— 简洁而优美的压力测试工具
Linux下使用的服务器压力测试工具,利用fork建立多个子进程,每个子进程在测试时间内不断与服务器建立TCP连接,发送请求报文,然后由父进程统计(通过管道):TCP连接成功次数,TCP连接失败次数,从服务器接收的数据量。
测试
运行./webbench -c 10500 -t 5 -2 http://127.0.0.1:9006/
,可知服务器可以承受1w+的并发连接,每秒处理请求数约4.5w(224613/5),且没有处理失败的请求。(webbench的HTTP请求仅仅只是访问web的首页,即http://127.0.0.1:9006/
,并没有测试登录等页面)
增大并发连接数./webbench -c 11000 -t 5 -2 http://127.0.0.1:9006/
,发现fork第10808 个子进程时失败。
再次运行,发现最大只能 fork 9099 个子进程了。这是因为webbench异常退出后并没有结束fork的子进程,因此需要killall webbench
结束fork的所有子进程。
ulimit用于shell启动进程所占用的资源,可以用来设置系统的限制。在root下进行open files
和max user processes
设置(普通用户下同一时间可以打开的文件描述符最大只能设置4096,最大的用户进程数只能设置63698。
linux下进程的进程最大数、最大线程数、进程打开的文件数和ulimit命令修改硬件资源限制
目前的问题,修改了open files
和max user processes
之后fork第10808 个子进程时失败,电脑性能的限制?默认的最大的用户进程数63698>>10808,为什么只能 fork 10808 个子进程?
试着改小max user processes=15000
,即ulimit -u 15000
,再次运行,fork第10808 个子进程时失败。猜测应该是系统性能的限制或者一些设置的问题。