zabbix 按CPU核数监控负载状态

使用zabbix自带的key来实现多核CPU监控

system.cpu.discovery

自动发现CPU核数:

未分类

定义宏

未分类

按核数监控CPU负载

$2:指key中的第二个参数,这里是idle(CPU空闲比例)

未分类

    us(user):非nice用户进程占用CPU的比率

    sy(system):内核、内核进程占用CPU的比率;

    ni(nice):如果一些用户进程修改过优先级,这里显示这些进程占用CPU时间的比率;

    id(idle):CPU空闲比率,如果系统缓慢而这个值很高,说明系统慢的原因不是CPU负载高;

    wa(iowait):CPU等待执行I/O操作的时间比率,该指标可以用来排查磁盘I/O的问题,通常结合wa和id判断

    hi(irq):CPU处理硬件终端所占时间的比率;

    si(softirq):CPU处理软件终端所占时间的比率;

    st(stealstealon):流逝的时间,虚拟机中的其他任务所占CPU时间的比率;

  用户进程占比高,wa低,说明系统缓慢的原因在于进程占用大量CPU,通常还会伴有教低的id,说明CPU空转时间很少;

  wa低,id高,可以排除CPU资源瓶颈的可能。  

  wa高,说明I/O占用了大量的CPU时间,需要检查交换空间的使用,交换空间位于磁盘上,性能远低于内存,当内存耗尽开始使用交换空间时,将会给性能带来严重影响,所以对于性能要求较高的服务器,一般建议关闭交换空间。另一方面,如果内存充足,但wa很高,说明需要检查哪个进程占用了大量的I/O资源。

    tps: 每秒I/O传输请求量;

    kB_read/s:每秒读取多少KB;

    kB_wrtn/s:每秒写多少KB;

    kB_read:一共读了多少KB;

    kB_wrtn:一共写了多少KB。

PHP-FPM进程CPU 飙高的原因及解决方案

在最近开发中,发现打开网页越来越慢,所以用用top命令发现,php-fpm CPU 飙到了90%以上,所以需要紧急处理这个问题,

未分类

主要解决思路如下:

1. 设置控制php-fpm进程池进程数量。

修改pm.max_children的数量,根据内存来进行分配,系统开一个进程20-30M。比如系统内存1G,那就将差不多能开30个进程,所以可以设置pm.max_children 为30,以此类推,然后需要重启下php-fpm服务。

pm.max_children:静态方式下开启的php-fpm进程数量。
pm.start_servers:动态方式下的起始php-fpm进程数量。
pm.min_spare_servers:动态方式下的最小php-fpm进程数量。
pm.max_spare_servers:动态方式下的最大php-fpm进程数量。

2. 开启慢日志。

编辑php-fpm.conf文件找到request_slowlog_timeout = 0这一行,默认值为0,表示不开启slowlog,将其值改为3s,表示跟踪执行时间达到或超过3s的脚本。找到slowlog,它的值表示慢执行日志的路径。

3.内存分配。

内存分配太少,理论上开一个进程消耗CPU 20-30M,所以1G内存的可以开30个进程左右,如果是虚拟机的话可以分配2G内存。

4. 编辑php-fpm.conf配置文件。

php_admin_value[memory_limit] = 128M(我服务器上的配置文件在/etc/php5/fpm/pool.d/www.conf 这个文件是被包含在php-fpm.conf里的) 后边的数字可以随便更改:32M,64M,128M,256M,512M,这个设置可根据你的服务器内存大小和你的需求来写,修改后要加载一下php-fpm服务。

欢迎补充!

使用MySQL Slow Log来解决MySQL CPU占用高的问题

但是怎么找到是哪个SQL语句的执行时间过长呢?可以通过MySQL Slow Log来找,详解如下。

首先找到MySQL的配置文件my.cnf,根据不同版本的mysql开启慢查询的配置也不一样

mysql 5.0 

[mysqld] 

long_query_time = 1 

log-slow-queries = /var/log/mysql/slow.log 

mysql 5.1 

[mysqld] 

long_query_time = 1 

slow_query_log=1 

slow_query_log_file = /var/log/mysql/slow.log 

long_query_time 是指执行超过多久的sql会被log下来,这里是1秒。 

log-slow-queries和slow_query_log_file 设置把日志写在哪里 

把上述参数打开,运行一段时间,就可以关掉了,省得影响生产环境

接下来就是分析了,我这里的文件名字叫 /var/log/mysql/slow.log。

先mysqldumpslow –help下,主要用的是

-s ORDER what to sort by (t, at, l, al, r, ar etc), ‘at' is default 

-t NUM just show the top n queries 

-g PATTERN grep: only consider stmts that include this string 

-s,是order的顺序,说明写的不够详细,主要有

c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序

-t,是top n的意思,即为返回前面多少条的数据

-g,后边可以写一个正则匹配模式,大小写不敏感的

mysqldumpslow -s c -t 20 /var/log/mysql/slow.log 

mysqldumpslow -s r -t 20 /var/log/mysql/slow.log 

上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。

mysqldumpslow -t 10 -s t -g “left join” /var/log/mysql/slow.log 

这个是按照时间返回前10条里面含有左连接的sql语句。

用了这个工具就可以查询出来那些sql语句是性能的瓶颈,进行优化,比如加索引,该应用的实现方式等。