zoukankan      html  css  js  c++  java
  • 系统状态检查和最大连接数调优,压测


    -----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


  • 相关阅读:
    vm扩容
    手算二维离散傅里叶变换
    取消vim模式匹配的高亮
    DS DI ES SI等等
    int and Integer
    为什么超类能引用子类的对象
    voltile解析
    java集合
    疑问:无限定通配符
    layui table 导出
  • 原文地址:https://www.cnblogs.com/linewman/p/9918703.html
Copyright © 2011-2022 走看看