Linux 系统监控

磁盘

找出占用磁盘最大的 10 个日志文件:

$ sudo du -ha /var/log/ | sort -hr | head

Linux 查看当前路径下所有文件的占用大小:

$ du -h --max-depth 1 | sort -h

macOS 查看当前路径下所有文件的占用大小(du 限制深度参数为 -d,且 sort 没有 -h 选项):

$ du -d1 | sort -nk1  

iostat

检查磁盘使用情况 - 来自 sysstat 安装包的 iostat 命令:

$ iostat -d -x 2 5

每 2 秒输出一次,一共输出 5 次。

iotop

iotop 可以像 top 一样列出所有进程的 IO 数据。

通过键盘的左右键,可以选择排序优先级。

iotop 常用命令

查看当前磁盘的读写:

$ sudo iotop -botqqq -n 10
  • -b batch mode 非交互模式
  • -o 只显示当前正在读写磁盘的进程
  • -t 每行前添加一个时间戳
  • -q quiet mode 不输出 header lines, 可以使用 -qq-qqq 选项精简 iotop 的输出
  • -n <N>--iter=<N> 运行 N 次后退出

通过 -k 指定 iotop 输出的读写磁盘单位为 K 并通过 grep 过滤出大于 10K/s 的进程:

$ sudo iotop -botqqqk -n 3 | grep -P "\d\d\.\d\d K/s"

将 iotop 加入 crontab

按常规方式添加 crontab 无效,如下:

$ sudo crontab -e
* * * * * root /sbin/iotop -botqqqk -n 3 | grep -P "\d\d\d\.\d\d K/s" >> /var/log/iotop.log

需要加入 crontab 文件才行。创建文件:

$ sudo vi /etc/cron.d/iotop

添加:

* * * * * root /sbin/iotop -botqqqk -n 3 | grep -P "\d\d\d\.\d\d K/s" >> /var/log/iotop.log

ionice 设定读写磁盘优先级

ionice 设置进程使用磁盘的优先级。

查看进程默认读写磁盘优先级:

$ ionice -p $(pgrep rsyslogd)
none: prio 0

设置进程读写磁盘优先级:

$ sudo ionice -c 3 -p $(pgrep rsyslogd)
$ ionice -p $(pgrep rsyslogd)
idle

-c 用于设置读写磁盘优先级的类别:

  • 0 (none) 默认优先级
  • 1 (Real time) 最高优先级
  • 2 (Best Effort) 中等优先级
  • 3 (Idle) 最低优先级

上例设置 rsyslogd 为最低优先级。

-p PIDs 可以一次设定多个进程的优先级。

systemctl 限制 IO 使用

通过 systemctl 查看 IO 权重:

$ systemctl show --property IOWeight rsyslog
IOWeight=[not set]

设置新的 IO 权重:

$ sudo systemctl set-property rsyslog IOWeight=1
$ systemctl show --property IOWeight rsyslog
IOWeight=1

Linux control group 中 io.weight 的值为 [0, 10000],值越大权重越高,默认为 100。以上设置 rsyslog.service 的权重为最低。