Linux 系统运行变慢排查之路
前言
当我们在Linux系统上部署项目,启动项目,会发现运行一段时间后,系统整体变慢,这是什么原因呢?首先判断到底是哪个正在运行的进程消耗过大、还有CPU 运行状态、内存运行是否过载、交换内存区是否已满、以及硬盘是否运行正常等相关因素。这些都是我们需要关心的地方,也是我们排查系统的思路。
一、检查CPU
我们可以执行命令 cat /proc/cpuinfo文件系统中查看 CPU 的提供商和相关详细配置信息。
# cat /proc/cpuinfo
再通过# lscpu命令查看具体微观信息。
# lscpu
使用 top 命令检查 CPU 负载
除了上述检查的情况之外,还可以使用命令 top 来检查 CPU 负载,将实时显示 process 的动态。资源使用最高的进程排在最前面。
参数:
-c:显示完整命令;
-b:以批处理模式显示程序信息;
-d NUM:设置信息更新次数;
-n NUM:显示更新十次后退出;
-p PID:将显示指定的进程信息;
-S:以累积模式显示程序信息;
利用 iotop 命令进行检查
假如你想知道到底哪个进程产生了 IO,数据读取速度等信息,这个时候就需要 iotop 这个工具了。它的输出和 top 命令类似;
参数:
-o:只显示正在产生 I/O 的进程或线程;
-b:非交互模式,一般用来记录日志;
-n NUM:设置监测的次数,默认无限;
-d SEC:设置每次监测的间隔,默认 1 秒;
-p PID:指定监测的进程/线程;
-u USER:指定监测某个用户产生的 I/O;
-P:仅显示进程,默认 iotop 显示所有线程;
-a:显示累积的 I/O,而不是带宽;
-k:使用 kb 单位进行显示;
-t:时间戳;;
-q:只在第一次监测时显示列名;
-qq:将永远不显示列名;
-qqq:将永远不显示 I/O 汇总;
案例:CPU低,负载高
1.通过top命令查看CPU等待IO时间,即%wa;
2.通过iostat -d -x -m 1 10查看磁盘IO情况;(安装命令 yum install -y sysstat)
3.通过sar -n DEV 1 10查看网络IO情况;
通过如下命令查找占用IO的程序;
ps -e -L h o state,cmd | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr
二、服务与空间
1.检查启动的服务
service --status-all 该命令查看所有服务当前的运行状态。将按照字母的顺序运行所有的 init 脚本。
# service --status-all
chkconfig --list 显示所有运行级系统服务的运行状态信息(on或off)。如果指定了name,那么只显示指定的服务在不同运行级的状态。
# chkconfig --list
initctl 是守护进程控制工具,管理员可以与 Upstart 守护进程进行通信和交互。
# initctl list
2.利用 free 命令来检查闲置内存空间
free 命令:用于显示内存状态,会显示内存的使用情况,实体内存,虚拟交换内存,共享内存,以及系统核心使用的缓冲区等等;
free [-b,-h,-k,-m,-o,-t,-V] [-s <间隔秒数>]
参数:
-b:以 byte 为单位显示内存使用情况;
-h:查看内存使用;
-k:以 KB 为单位显示内存使用情况;
-m:以 MB 为单位显示内存使用情况;
-o:不显示缓冲区调节列;
-t:显示内存总和列;
-V:显示版本信息;
-s <间隔秒速>:将以动态的形式持续观察内存使用情况;
案例:使用free -h查看内存使用
详解:
1、total:总的物理内存
2、used:系统使用的内存,包括buff+cache。并非系统真正使用的内存。系统真正使用的内存=used-buff/cache
3、free:空闲的内存,系统未使用的内存,并不是系统启动应用程序可以真正使用的内存。
4、shared:共享内存
5、buff/cache:磁盘缓存的大小
6、available:在旧版free中,没有这个选项。这个选项指的是,系统启动程序时可以利用的内存,当这个选项很小或者不够启动程序所需的内存,会提示系统内存不足,无法启动,此时就需要处理问题,是物理内存真的不足,还是清理系统缓存。
Cached主要负责缓存文件使用, 日志文件过大,索引太多(redis,es,log处理等)造成cached区内存增大把内存占用完 ,Linux服务器会自动释放内存,保障系统运行,但只会释放够用的内存,而不会去释放更多的内存。
总结
很多人说,部署是运维人员的工作,其实在当下,程序员自己也是需要学会部署的,因为small company的部署就是程序员的part-job,而部署在Linux系统之后,运行项目不可避免就会出现各种问题,学会如何排查问题也是一种优势的能力。