发现问题大概有两种:
- 一种是用户投诉。
- 另一种是自己主动发现问题。
如果是用户投诉的具体到哪一单出了问题,首先可以去看数据库,然后再去查日志和调用链路。如果是其他问题,那么首先去得看一下线上的机器是否正常,主要是分为这么几个方面: - 网络: netstat
- CPU: top ps
- 内存: free
- IO: iostat
如果发现某个进程特别占用资源特别多的话,如果是多线程的还可以去看究竟是哪个线程占用率比较高。有的时候没有发现明显问题的话,还可以去看一看是不是数据库有死锁,或者主从延迟情况。
发现问题之后,如果是代码的问题,最好解决办法就是先把代码回滚了,如果问题不是很紧急,就先改代码,然后发一个紧急版本。如果是高并发引起的资源不够用问题,最简单的粗暴的办法就是:加机器。之后可以对业务量进行评估,进行限流等操作。下面针对上面的问题和解决方案讲一讲常用的基本命令,还有一些Linux的基本知识。
遇事不决先top
先放一个top命令截图:

第一行的load average:
load average: 0.00, 0.1, 0.15 ,系统的平均负载数:系统平均负载指的是运行队列平均长度,也就是等待cpu的平均进程数,表示 1分钟、5分钟、15分钟到现在的平均数。对于单核cpu (多核的这个经验数字要乘上核心数):
- load < 0.7:系统很闲,可以考虑多部署一些服务;
- 0.7<load <1:系统状态还不错;
- load >= 1:系统快要处理不过来,必须想办法将这个值降下来;
- load 达到5.0表明系统有很严重的问题,长时间没有响应或死机;
可以看下这篇文章的解释:系统平均负载的通俗解释
第三行的cpu使用率:
- 19%us (用户空间CPU占用率)
- 1.0%sy (内核空间CPU占用率)
- 0.0%ni (用户进程空间改变过优先级的进程CPU的占用率)
- 79.9%id (空闲CPU占有率)
- 0.0%wa (等待输入输出的CPU时间百分比)
- 0.0%hi (硬件中断请求)
- 0.0%si (软件中断请求)
- 0.0%st (分配给运行在其它虚拟机上的任务的实际 CPU时间)
第四行 物理内存
- total:总物理内存
- free: 空闲内存
- used:已使用内存
- buff/cache:缓存使用内存
这里要说明一下linux的内存机制,linux会优先尽可能的占用内存,比如:将尽可能多的文件写入缓存之中,等到系统内存不够用时,再进行释放。也有命令可以强制释放。
buffer和cache的区别: 一般从翻译上来说,cache叫缓存,buffer叫缓冲,buffer的用法是达到一定量后方便进行读写,减少系统调用次数,cache是缓存,对之前io过的数据进行缓存,(命中率较高),提高io效率。
第五行 swap交换区
这是一块单独的区域,:
- total:交换区总量
- free:空闲交换区总量
- used: 使用的交换区总量
- avail mem: 可用交换取总量
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。有命令可以调整swap分区大小。有一个进程叫kswaped,专门用来处理swap和物理内存的交换,它有复杂的算法来判断是否需要写入swap,不是内存够就不写,内存快不够用了就不写,一般要尽可能的不使用swap,如果swap为空,在内存不够用的场景下会杀进程。
单独进程
PID (进程id)
USER (进程所有者的用户名)
PR (进程优先级)
NI (nice值。负值表示高优先级,正值表示低优先级)
VIRT (进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES)
RES (进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA)
SHR (共享内存大小,单位kb)
S (进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程)
%CPU (上次更新到现在的CPU时间占用百分比)
%MEM (进程使用的物理内存百分比)
TIME+ (进程使用的CPU时间总计,单位1/100秒)
COMMAND (进程名称[命令名/命令行])
还可以使用top查看某个进程里面单一线程的使用情况:
top -H -p + 进程号

检查指定进程
ps aux | grep + 进程号
USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START TIME | COMMAND

vsz:虚拟内存,包括进程可以访问的所有内存,包括进入交换分区的内容,以及共享库占用的内存。
rss:实际内存

地址:rss和vsz
netstat检查网络
- a (all)显示所有选项,默认不显示LISTEN相关
- t (tcp)仅显示tcp相关选项
- u (udp)仅显示udp相关选项
- n 拒绝显示别名,能显示数字的全部转化成数字。
- l 仅列出有在 Listen (监听) 的服務状态
- p 显示建立相关链接的程序名
- r 显示路由信息,路由表
- e 显示扩展信息,例如uid等
- s 按各个协议进行统计
- c 每隔一个固定时间,执行该netstat命令。
常用命令:netstat -anp
netstat命令详解
iostat检查io
iostat用于输出CPU和磁盘I/O相关的统计信息.

avg-cpu段:
- %user: 在用户级别运行所使用的CPU的百分比.
- %nice: nice操作所使用的CPU的百分比.
- %sys: 在系统级别(kernel)运行所使用CPU的百分比.
- %iowait: CPU等待硬件I/O时,所占用CPU百分比.
- %idle: CPU空闲时间的百分比.
Device段:
tps: 每秒钟发送到的I/O请求数.
Blk_read /s: 每秒读取的block数.
Blk_wrtn/s: 每秒写入的block数.
Blk_read: 读入的block总数.
Blk_wrtn: 写入的block总数.