第一次接触atop是在五年前的一个深夜,当时我管理的服务器突然CPU飙到100%,传统工具如top只能告诉我"CPU用满了",却说不清到底是谁在捣鬼。直到同事教我输入atop -r /var/log/atop/atop_20240305调出历史日志,瞬间锁定了那个疯狂创建线程的Python脚本——这就是atop给我的第一印象:时间旅行者般的故障回溯能力。
与常见的top/htop不同,atop的独特价值在于三维度立体监控:
这里有个真实案例:某次MySQL查询变慢,用atop -d发现磁盘视图里sdb的busy持续90%以上,结合atop -m看到有个java进程的RGROW字段每小时增长2GB,最终定位到是ES客户端未关闭游标导致的内存泄漏。这种跨资源关联分析正是atop的杀手锏。
遇到CPU问题时,我通常会三键齐按:
wait值超过30%说明磁盘IO成瓶颈1展开所有核心,观察是否有个别核心满载(常见于单线程应用)avg15持续高于CPU核数2倍,就需要考虑扩容上周处理的一个典型案例:某台16核服务器usr占比70%看似正常,但展开cpu视图发现15号核心持续100%,进一步用P键过滤发现是个Go程式的GC线程在单核空转——这就是CPU热点定位的标准流程。
内存问题最怕"温水煮青蛙",我的排查三板斧:
slab突然增长可能是内核模块泄漏swout持续大于0就要警惕OOM风险m视图排序找增长最快的进程有个经典陷阱:某次free显示内存充足,但atop -m发现cache占比90%,用echo 3 > /proc/sys/vm/drop_caches释放后,slab却纹丝不动——最后用atop -r对比三天数据,发现是某个自定义驱动的内存泄漏。
当iostat显示util很高时,我会用atop -d进入磁盘视图:
busy和avq,超过80%要考虑磁盘性能瓶颈v键展开具体进程的读写详情SHIFT+C按磁盘负载排序曾有个有趣发现:某SSD磁盘busy只有40%但性能极差,在atop里发现avq(平均队列长度)高达32——原来是RAID卡电池故障导致write-back缓存失效。
网络抖动时快速诊断步骤:
n进入网络视图NET列的tcpi/s和tcpo/sSHIFT+N按网络流量排序进程TCP子视图看重传率最近用这个方法抓到一个Kafka生产者:虽然总流量不大,但tcpi/s高达5000+,原来是消息体积太小导致包速率触发了网卡中断瓶颈。
分析三天前的故障:
bash复制atop -r /var/log/atop/atop_20240302 -b 14:00 -e 15:00
关键技巧:
t和T前后翻页b输入15:30直接跳转时间点SHIFT+P用正则过滤进程名有次分析半夜的CPU毛刺,通过atop -r配合b命令,发现每天2:15准时出现的峰值——原来是crontab里忘了加nice的报表任务。
我的监控脚本模板:
bash复制atop -r $LOG_FILE -P $PID -b $START_TIME -e $END_TIME \
| awk '/^CPU/{print $4,$5}' > cpu_report.csv
常用过滤选项:
-P:按进程名正则过滤-U:按用户名过滤-G:按进程组过滤这个方案帮我们发现了周期性内存泄漏:每天增长2%,周末清零——原来是工作日定时任务的资源未释放。
高频问题处理流程:
atop里按SHIFT+P过滤目标进程usr/sys比例
sys过高:用strace -c查系统调用usr过高:用perf top查热点函数CSW列上下文切换次数优化过的一个Python服务:sys占比60%说明问题在系统调用,用atop定位到是过多的stat()调用,加上缓存后性能提升8倍。
内存优化三步法:
atop -m找VSIZE大但RSIZE小的进程PAG列的swin/swoutpmap -x $PID分析具体内存分布有个Go服务占用20GB虚拟内存引发告警,但atop显示实际只用500MB——原来是默认GOMEMLIMIT设置过高,调整后不再触发监控告警。
我的/etc/default/atop常用设置:
ini复制INTERVAL=60 # 采样间隔(秒)
LOGPATH=/var/log/atop # 日志路径
LOGINTERVAL=1440 # 每日轮转
LOGGENERATIONS=28 # 保留28天
DISKFLAGS="nvme0n1,sda" # 只监控关键磁盘
特别注意:
基于atop日志的监控规则示例:
avg15 > 2*CPU核数持续5分钟swout > 0持续10分钟busy > 90%且avq > 10持续15分钟配合Zabbix的自动抓取脚本:
bash复制atop -r $(ls -t /var/log/atop/atop_* | head -1) -b -5min \
| grep '^CPU' | tail -1 | awk '{print $4+$5}'
经过上百次实战,我总结出四层定位法:
最近用这个模型解决了一个诡异问题:每天下午数据库变慢,atop显示:
busy不高但avq很高tcpo在特定时段激增RGROW同步增长ionice调整IO优先级后解决。