系统状态检查和最大连接数调优,压测

时间:2024-02-15 18:13:49

-----top 系统状态

1.cpu状态
6.7% us — 用户空间占用CPU的百分比。
0.4% sy — 内核空间占用CPU的百分比。
92.9% id — 空闲CPU百分比

2.系统负载
load average: 1.15, 1.42, 1.44 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

3.内存状态
内存状态:这里要说明的是不能用windows的内存概念理解这些数据

8306544k total — 物理内存总量(8GB)
7775876k used — 使用中的内存总量(7.7GB)
530668k free — 空闲内存总量(530M)

可用内存的计算公式:第四行的free + 第四行的buffers + 第五行的cached
如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:

530668+79236+4231276 = 4.7GB。


4.内存监控swap used
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
79236k buffers — 缓存的内存量 (79M)

5.各进程耗CPU和内存

使用频率最高的是P、T、M,因为通常使用top,我们就想看看是哪些进程最耗cpu资源、占用的内存最多。




-------apache  httpd总进程数和进程占用内存平均数 = 能支持多少人访问

查看httpd进程总数:   ps -aux | grep httpd | wc -l  

为了验证,查看了连接数和当前的连接数,分别是:
netstat -ant | grep $ip:80 | wc -l
netstat -ant | grep $ip:80 | grep EST | wc -l

计算每个httpd进程占用内存的平均数K:
ps aux|grep -v grep|awk \'/httpd/{sum+=$6;n++};END{print sum/n}\'

假设每进程占用内存200K,服务器内存有2G,除去常规启动的服务大约需要500M(保守估计),还剩1.5G可用,那么理论上可以支持1.5*1024*1024*1024/200000 = 8053.06368
约8K个进程。一般5-20%,用户连接数1000,支持并发200即可,但不一定。8千进程那么支持2W人同时访问应该没问题(能保证其中8K的人访问很快,其他的可能需要等待1、2秒

才能连上,而一旦连上就会很流畅)。

---------------如何配置APACHE和MYSQL最大连接数
Apache 默认250--超过时等待   MYSQL 默认 100----超过报错,数据库连接过多

分别在哪个位置设置:http://www.51testing.com/html/93/316693-804721.html

连接数应该加多少:连接数理论上当然是支持越大越好,但要在服务器的能力范围内,这跟服务器的CPU、内存、带宽等都有关系,否则宕机吧。

理论上:Apache与mysql的并发关系
  如果Apache最大并发数配置是600,大于mysql最大并发数200,每个apache请求要对应一个mysql连接,而Apache的并发能力要远大于mysql服务器的并发能力。高并发情况下

,mysql的查询还没有返回结果,但下一次的apache请求已经到了,堆积效果就是mysql都是满额并发运行,可能导致连接mysql错误:“too many connections…”。

在prefork工作模式下,一次用户请求是开一个进程(每次处理请求非常快,很快会放开),worker 有进程开线程的概念。
prefork工作模式配置格式为   ServerLimit  必须在MaxClients 前面,大于它:


  ServerLimit             2000    
        StartServers               5    #指定服务器启动时建立的子进程数量 
        MinSpareServers            5    #指定空闲子进程的最小数量 ----空闲备用,有请求过来时减少CPU开销
        MaxSpareServers           10    #指定空闲子进程的最大数量 
        MaxClients               150    #指定同一时间客户端最大接入请求的数量(单个进程并发线程数),任何超过该限制的请求都将进入等候队列,一旦一个连接被

释放,队列中的请求将得到服务 
        MaxRequestsPerChild        0    #指定每个子进程在其生存周期内允许伺服的最大请求数量,默认为10000,0表示子进程永远不结束 

 MaxClients是这些指令中最为重要的一个,设定的是 Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值150是远远不够的,如果请求总数已达到这个值

(可通过ps -ef|grep httpd|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这

个值越大,可以 处理的请求就越多,但Apache默认的限制不能大于256。在 apache2 中通过ServerLimit指令无须重编译Apache就可以加大MaxClients。
   虽然通过设置ServerLimit,我们可以把MaxClients加得很大,但是往往会适得其反,系统耗光所有内存。以一台服务器为例:内存2G,每 个apache进程消耗大约0.5%(可

通过ps aux来确认)的内存,也就是10M,这样,理论上这台服务器最多跑200个apache进程就会耗光系统所有内存,所以,设置MaxClients要慎重。
http://blog.sina.com.cn/s/blog_12b1464290102x35e.html

Nginx配置性能优化 : http://blog.csdn.net/xifeijian/article/details/20956605
-------ad并发测试
ab -kc 1000 -n 1000 http://localhost/ab.html
这个指令会使用1000个并发,进行连接1000次。

-n requests Number of requests to perform
//在测试会话中所执行的请求个数(本次测试总共要访问页面的次数)。默认时,仅执行一个请求。
-c concurrency Number of multiple requests to make
//一次产生的请求个数(并发数)。默认是一次一个。
参数说明:http://024mj.blog.51cto.com/10252785/1684794



-n 测试的总请求数。默认时,仅执行一个请求。
-c 一次并发请求个数。默认是一次一个。  -kc 最大只能20000测试


我们假设你的网站是一个静态站,所有的请求都走nginx,然后需要确认测试机和服务器的网络通信要畅通。ab这种工具对于压力测试来说不是很有说服力,推荐jmeter或者

loadrunner。压力测试的时候要保证测试的响应时间曲线稳定住一定时间后,才认为是当前被测试服务器的真实性能,因为刚开始测试的时候需要一定预热时间,一般测试到一

定时间之后曲线会稳定住,这时候再判断当前的响应时间。

4、其它注意事项
1)
ab并发数不能大于请求数,会提示

ab: Cannot use concurrency level greater than total number of requests

2)
请求数默认不能超过1024个,会提示

socket: Too many open files (24)

可用ulimit -n命令修改,例如:ulimit -n 8192 (设置用户可以同时打开的最大文件数)。

3)
并发数默认不能大于20000个,会提示

ab: Invalid Concurrency [Range 0..20000]

需要修改apache源代码support目录下ab.c文件,找到:
#define MAX_CONCURRENCY 20000
将宏定义的值改大,重新编译安装apache。

4)
提示

apr_socket_recv: Connection reset by peer (104)

网上说是apr-util有些问题,不太稳定,多试几次就好了。

https://www.cnblogs.com/archoncap/p/5883723.html
apr_socket_recv这个是操作系统内核的一个参数,在高并发的情况下,内核会认为系统受到了SYN flood攻击,会发送cookies(possible SYN flooding on port 80. Sending 

cookies),这样会减慢影响请求的速度,所以在应用服务武器上设置下这个参数为0禁用系统保护就可以进行大并发测试了:
# vim /etc/sysctl.conf 
net.ipv4.tcp_syncookies = 0
# sysctl -p
然后就可以超过1000个并发测试了。

--------------------------------------------------参考资料-------------------------------------

参考资料:

top系统状态命令---内存和CPU--总得,具体的--程序问题:

2 users — 当前有2个用户登录系统
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

剩余内存计算:
如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:

530668+79236+4231276 = 4.7GB。
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。


注:强调一下,使用频率最高的是P、T、M,因为通常使用top,我们就想看看是哪些进程最耗cpu资源、占用的内存最多; 
注:通过”shift + >”或”shift + <”可以向右或左改变排序列 
如果只需要查看内存:可用free命令。只查看uptime信息(第一行),可用uptime命令;


参考资料:http://www.jb51.net/article/40807.htm


--------------
查看httpd进程总数:   ps -aux | grep httpd | wc -l  

为了验证,查看了连接数和当前的连接数,分别是:
netstat -ant | grep $ip:80 | wc -l
netstat -ant | grep $ip:80 | grep EST | wc -l

------------------------
Apache 默认250--超过时等待   MYSQL 默认 100
apache和mysql连接性能优化(怎么改):http://www.51testing.com/html/93/316693-804721.html
http://blog.sina.com.cn/s/blog_680342610102vmno.html



Apache与mysql的并发关系
  Apache最大并发数配置是600,大于mysql最大并发数200,每个apache请求要对应一个mysql连接,而Apache的并发能力要远大于mysql服务器的并发能力。高并发情况下,

mysql的查询还没有返回结果,但下一次的apache请求已经到了,堆积效果就是mysql都是满额并发运行,可能导致连接mysql错误:“too many connections…”。
http://m.blog.sina.com.cn/s/blog_718ac8bf0100pkv6.html#page=3




加多少:http://m.blog.csdn.net/moqiang02/article/details/22481219   (好资料)
连接数理论上当然是支持越大越好,但要在服务器的能力范围内,这跟服务器的CPU、内存、带宽等都有关系
查看当前的连接数可以用:
ps aux | grep httpd | wc -l
或:
pgrep httpd|wc -l

计算httpd占用内存的平均数:
ps aux|grep -v grep|awk \'/httpd/{sum+=$6;n++};END{print sum/n}\'

由于基本都是静态页面,CPU消耗很低,每进程占用内存也不算多,大约200K。服务器内存有2G,除去常规启动的服务大约需要500M(保守估计),还剩1.5G可用,那么理论上可

以支持1.5*1024*1024*1024/200000 = 8053.06368
约8K个进程,支持2W人同时访问应该是没有问题的(能保证其中8K的人访问很快,其他的可能需要等待1、2秒才能连上,而一旦连上就会很流畅)控制最大连接数的MaxClients 

,因此可以尝试配置为:

StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5000
MaxRequestsPerChild 100