linux服务器性能监控以及mysql状态查看
Posted 飞入闲窗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux服务器性能监控以及mysql状态查看相关的知识,希望对你有一定的参考价值。
写在最前面:以下的都是命令形式完成,如果有编码基础,最好自己编码完成,并且打印出来的结果能够更直观,可以做成通用的。
1.Linux服务器
1.1PS
ps -ax | grep java:查找java相关的进程
ps -aux --sort -pcpu:根据cup的使用降序排序
ps -aux --sort -pmem:根据内存的使用降序排序
ps -aux | head -n 10:只显示前10的进程 【以上可以自由组合 大家看情况使用】
1.2top
- us 用户空间占用CPU百分比
- sy 内核空间占用CPU百分比
- id 空闲CPU百分比
- total 物理内存总量
- used 使用的物理内存总量
- free 空闲内存总量
- buffers 用作内核缓存的内存量
1.3free
- total:表示物理内存总量(total = used + free)
- used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
- free:未被分配的内存。
- shared:共享内存,一般系统不会用到。
- buffers:系统分配但未被使用的buffers 数量。
- cached:系统分配但未被使用的cache 数量
- used:也就是第一行中的used – buffers-cached 也是实际使用的内存总量。
- Swap:表示硬盘上交换分区的使用情况,这里我们不做关注。
1.4vmstat
举例 vmstat 3 10 标识3秒采集一次 一共采集10次
- r列 显示运行和等待CPU时间片的进程数,若其值长时间大于系统CPU个数,就说明CPU资源可能不足,可以考虑增加CPU;
- b列 显示在等待资源的进程数,比如正在等待I/O或者内存交换等。
- swpd列 显示切换到内存交换区的内存数量(以KB为单位)。若swpd的值不为0或者比较大,同时si、so的值长时间为0,那这种情况一般不用担心,不会影响系统性能
- free列 显示当前空闲的物理内存数量(以KB为单位)
- buff列 显示buffers cache的内存数量,一般对块设备的读写才需要缓冲
- cache列 显示page cached的内存数量,一般作文件系统的cached,频繁访问的文件都会被cached。如果cached值较大,就说明cached文件数较多。如果此时IO中的bi比较小,就说明文件系统效率比较好
- si列 显示由磁盘调入内存,也就是内存进入内存交换区的数量
- so列 显示由内存调入磁盘,也就是内存交换区进入内存的数量
备注:一般情况下,si、so的值都为0,如果si、so的值长时间不为0,则表示系统内存不足,需要考虑是否增加系统内存。
- bi列 显示从块设备读入的数据总量(即读磁盘,单位KB/秒)
- bo列 显示写入到块设备的数据总量(即写磁盘,单位KB/秒)
备注:这里设置的bi+bo参考值为1000,如果超过1000,而且wa值比较大,则表示系统磁盘IO性能瓶颈。
- in列表示在某一时间间隔中观察到的每秒设备中断数
- cs列表示每秒产生的上下文切换次数
备注:上面这两个值越大,会看到内核消耗的CPU时间就越多,这个时候可能要考虑下为何内核的消耗会这么大,有可能有瓶颈存在。
- us列 显示了用户进程消耗CPU的时间百分比。us的值比较高时,说明用户进程消耗的CPU时间多,如果长期大于50%,需要考虑优化程序啥的。
- sy列显示了内核进程消耗CPU的时间百分比。sy的值比较高时,就说明内核消耗的CPU时间多;如果us+sy超过80%,就说明CPU的资源存在不足。
- id列 显示了CPU处在空闲状态的时间百分比
- wa列 显示IO等待所占的CPU时间百分比。wa值越高,说明IO等待越严重。如果wa值超过20%,说明IO等待严重
- st列 虚拟机占用的时间百分比。
1.5 sar
未安装的情况下,如下进行安装
每10秒采样一次,连续采样3次,观察CPU 的使用情况,并将采样结果以二进制形式存入当前目录下的文件cpu_info中
其他命令:
sar -u/-q/-B/-r/-W/-b/-d
1.6 其他
- iostat:主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。
- iotop 是一个用来监视磁盘 I/O 使用状况的 top 类工具
- mpstat:其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中
- netstat:命令是一个监控TCP/IP网络的非常有用的工具
- pidstat: sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况
2.数据库性能监控
2.1 SHOW FULL PROCESSLIST
- Closing tables
正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。 - Connect Out
复制从服务器正在连接主服务器。 - Copying to tmp table on disk
由于临时结果集大于tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。 - Creating tmp table
正在创建临时表以存放部分查询结果。 - deleting from main table
服务器正在执行多表删除中的第一部分,刚删除第一个表。 - deleting from reference tables
服务器正在执行多表删除中的第二部分,正在删除其他表的记录。 - Flushing tables
正在执行FLUSH TABLES,等待其他线程关闭数据表。 - Killed
发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。mysql会在每次的主循环中检查kill标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么kill请求会在锁释放时马上生效。 - Locked
被其他查询锁住了。 - Sending data
正在处理SELECT查询的记录,同时正在把结果发送给客户端。 - Sorting for group
正在为GROUP BY做排序。 - Sorting for order
正在为ORDER BY做排序。 - Opening tables
这个过程应该会很快,除非受到其他因素的干扰。例如,在执ALTER TABLE或LOCK TABLE语句行完以前,数据表无法被其他线程打开。正尝试打开一个表。 - Removing duplicates
正在执行一个SELECT DISTINCT方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端。 - Reopen table
获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表。 - Repair by sorting
修复指令正在排序以创建索引。 - Repair with keycache
修复指令正在利用索引缓存一个一个地创建新索引。它会比Repair by sorting慢些。 - Searching rows for update
正在讲符合条件的记录找出来以备更新。它必须在UPDATE要修改相关的记录之前就完成了。 - Sleeping
正在等待客户端发送新请求. - System lock
正在等待取得一个外部的系统锁。如果当前没有运行多个mysqld服务器同时请求同一个表,那么可以通过增加--skip-external-locking参数来禁止外部系统锁。 - Upgrading lock
INSERT DELAYED正在尝试取得一个锁表以插入新记录。 - Updating
正在搜索匹配的记录,并且修改它们。 - User Lock
正在等待GET_LOCK()。 - Waiting for tables
该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE,或OPTIMIZE TABLE。 - waiting for handler insert
INSERT DELAYED已经处理完了所有待处理的插入操作,正在等待新的请求。
注意:大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。
2.2show status
下面我们看几个常用的带选项的命令
- 查询当前MySQL本次启动后的运行统计时间
show status like uptime;
- 查看本次MySQL启动后执行的select语句的次数
show status like com_select;
- 查看本次MySQL启动后执行insert语句的次数
show [global] status like com_insert;
- 查看本次MySQL启动后执行update语句的次数
show [global] status like com_update;
- 查看本次MySQL启动后执行delete语句的次数
show [global] status like com_delete;
- 查看MySQL服务器的线程信息
show status like Thread_%;
- 查看试图连接到MySQL(不管是否连接成功)的连接数
show status like connections;
- 查看线程缓存内的线程的数量
show status like threads_cached;
- 查看立即获得的表的锁的次数
show status like table_locks_immediate;
- 查看不能立即获得的表的锁的次数。如果该值较高,并且有性能问题,你应首先优化查询,然后拆分表或使用复制
show status like table_locks_waited;
- 查看查询时间超过long_query_time秒的查询的个数
show status like slow_queries;
系统慢查询状态检查
show global status like %slow%;
mysqldumpslow命令
慢查询日志有可能会有很多重复的sql语句,我们如何过滤呢?Mysql有自带的命令mysqldumpslow可进行查询,例下列命令可以查出访问次数最多的20个sql语句
mysqldumpslow -s c -t 20 host-slow.log
通过mysql自带profiling(性能分析)工具可以诊断某个sql各个执行阶段消耗的时间,每个执行阶段在cpu disk io等方面的消耗情况。
show variables like %profiling%;
以上是关于linux服务器性能监控以及mysql状态查看的主要内容,如果未能解决你的问题,请参考以下文章