09
系统监控与日志体系
Monitoring & Logging
服务器半夜挂了,你得靠"体检数据"和"病历本"倒推现场。监控是看它现在活不活、累不累;日志是翻它过去干了啥。这两样是运维的眼睛。
监控命令:看懂这几个数字
| 命令 | 看什么 |
|---|---|
top / htop | 实时 CPU、内存、进程排行。按 P 按 CPU 排,按 M 按内存排,q 退出。 |
free -h | 内存使用。重点看 available 那行,不是 used。 |
uptime | 开机多久 + load average 1/5/15 分钟负载。一般别超过 CPU 核数。 |
vmstat 1 | 每秒刷新一行,看 CPU/内存/IO 综合。bi/bo 大说明磁盘忙。 |
iostat | 磁盘读写详细(sysstat 包)。 |
sar | 历史性能数据(sysstat 包),能回看过去几点 CPU 高。 |
dmesg | 内核环形缓冲区日志,硬件报错、磁盘掉了之类先看它。 |
top 输出各列含义
$ top
# 上半部分:整体
load average: 0.50, 0.20, 0.10 # 1/5/15 分钟负载
%Cpu(s): 5.0 us, 2.0 sy, 93.0 id # id=空闲率,越高越好
MiB Mem: 3968 total, 1200 free, 2100 used
# 下半部分进程:PID 谁、%CPU 占比、%MEM 内存、COMMAND 是什么
881 www-data 2.0 5.0 nginx: worker
1024 mysql 8.0 20.0 /usr/sbin/mysqld
一次性体检命令
free -h # 内存总览,看 available
uptime # 负载和开机时长
vmstat 1 3 # 每秒一行,共 3 行;看 r(运行队列)、wa(IO等待)
iostat -x 1 # 磁盘使用率,%util 接近 100% 就是磁盘瓶颈
sar -u 1 3 # CPU 历史/实时采样(需 sysstat)
dmesg | tail -20 # 最近的内核消息
$ free -h
total used free shared buff/cache available
Mem: 3.8Gi 2.1Gi 1.0Gi 50Mi 700Mi 1.5Gi
$ uptime
10:40:01 up 2 days, 1:20, load average: 0.50, 0.20, 0.10
free 不是看 free 那列
Linux 会把空闲内存拿去做磁盘缓存(buff/cache),所以 free 列往往很小,那不是真的内存不足。要看 available 列——它是"程序现在能真正申请到的内存"。available 快见底、swap 用量在涨,才是真缺内存。
日志体系:/var/log 是病历本
| 日志文件 | 内容 |
|---|---|
/var/log/syslog / /var/log/messages | 系统主日志(Ubuntu 叫 syslog,RHEL 叫 messages)。 |
/var/log/auth.log / /var/log/secure | 登录记录:谁在什么时候登录、失败多少次、sudo 了什么。查入侵先看它。 |
/var/log/nginx/ | web 服务日志:access.log(访问)、error.log(错误)。 |
/var/log/journal/ | systemd 的二进制日志(配合 journalctl 读)。 |
/var/log/kern.log | 内核日志,硬件/驱动问题在这。 |
journalctl 常用姿势
journalctl -u nginx -f # 跟 nginx 日志
journalctl -u ssh --since today # 今天的 ssh 日志
journalctl -p err --since "1 hour ago" # 最近一小时的错误
journalctl --boot -p err # 本次开机以来的错误
logrotate:日志别把磁盘撑爆
日志天天涨,不切割迟早撑爆磁盘。logrotate 是系统自带的"日志轮转员":按天/按大小把日志改名归档、压缩旧的、删太老的。配置在 /etc/logrotate.d/ 下,服务装的时候一般会自动写一份。默认每天跑一次,不用你管。
/etc/logrotate.d/myapp 示例
/var/log/myapp/*.log {
daily
rotate 7 # 保留 7 天
compress # 旧日志压缩
missingok # 日志不存在不报错
notifempty # 空日志不轮转
postrotate
systemctl reload myapp
endscript
}
记
本章小结
① 体检三件套:top/htop 看进程、free -h 看内存、uptime 看负载;负载别超核数。
② 病历本在 /var/log/:syslog/messages 系统、auth/secure 登录;systemd 服务日志走 journalctl -u。
③ 日志别让它无限涨,logrotate 自动切割,是出厂就配好的。