-----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的并发关系
,mysql的查询还没有返回结果,但下一次的apache请求已经到了,堆积效果就是mysql都是满额并发运行,可能导致连接mysql错误:“too
many connections…”。
在prefork工作模式下,一次用户请求是开一个进程(每次处理请求非常快,很快会放开),worker
有进程开线程的概念。
prefork工作模式配置格式为 ServerLimit
必须在MaxClients 前面,大于它:
释放,队列中的请求将得到服务
(可通过ps -ef|grep httpd|wc
-l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这
个值越大,可以 处理的请求就越多,但Apache默认的限制不能大于256。在 apache2
中通过ServerLimit指令无须重编译Apache就可以加大MaxClients。
通过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的并发关系
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