楼层: 首页/ 软件技术/ Linux/ 系统监控与日志体系
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 自动切割,是出厂就配好的。