我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

Linux 硬件管理命令实战:df、du、top、free、iotop 详解

Linux 硬件管理命令实战:df、du、top、free、iotop 详解 Linux 硬件管理命令实战df、du、top、free、iotop 详解【免费下载链接】linux-tutorial:penguin: Linux教程主要内容Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial在 Linux 系统运维中硬件资源的监控与管理是日常工作的核心。本文基于 linux-tutorial 仓库 docs/linux/cli/linux-cli-hardware.md 整理围绕磁盘空间df/du、系统运行状态top、内存free与磁盘 I/Oiotop五大命令展开覆盖命令语法、常用选项、输出字段逐一拆解与实战示例。读完本文你将能够独立完成磁盘容量评估、目录占用排查、CPU/内存实时监控、内存缓存机制辨析以及按进程定位 I/O 瓶颈等常见运维任务。1. Linux 硬件管理要点Linux 提供了丰富的命令行工具用于硬件资源监控针对不同维度选择正确的工具是高效运维的前提。本仓库 docs/linux/cli/README.md 将命令按用途分类硬件管理对应的核心命令组合如下需求命令关键词定位查看磁盘空间df文件系统层面查看文件或目录的磁盘空间du文件/目录层面实时查看系统整体运行状态如 CPU、内存top进程与系统负载查看已使用和未使用的内存free内存与交换分区查看磁盘 I/O 使用状况iotop进程级 I/O其中df、du属于 coreutils 核心工具在 codes/linux/sys/install-tools.sh 中通过yum install -y coreutils安装iotop是独立工具Ubuntu 下用apt-get install iotopCentOS 下用yum install iotop。2. df查看磁盘分区空间df命令用于显示磁盘分区上可使用的磁盘空间默认显示单位为 KB利用它可以获取硬盘已被占用多少空间、还剩多少空间等信息。2.1 基础用法# 查看系统磁盘设备默认是 KB 为单位 [rootLinServ-1 ~]# df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda2 146294492 28244432 110498708 21% / /dev/sda1 1019208 62360 904240 7% /boot tmpfs 1032204 0 1032204 0% /dev/shm /dev/sdb1 2884284108 218826068 2518944764 8% /data1输出字段含义文件系统为设备名1K-块为总容量KB已用为已用空间可用为剩余空间已用%为使用率百分比挂载点为该分区挂载到的目录。2.2 常用选项-h以 KB 以上的单位如 G、M人性化显示可读性更高[rootLinServ-1 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 140G 27G 106G 21% / /dev/sda1 996M 61M 884M 7% /boot tmpfs 1009M 0 1009M 0% /dev/shm /dev/sdb1 2.7T 209G 2.4T 8% /data1-a显示全部文件系统包括/proc、/sys、/dev/pts等 0 容量的伪文件系统[rootLinServ-1 ~]# df -a 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda2 146294492 28244432 110498708 21% / proc 0 0 0 - /proc sysfs 0 0 0 - /sys devpts 0 0 0 - /dev/pts /dev/sda1 1019208 62360 904240 7% /boot tmpfs 1032204 0 1032204 0% /dev/shm /dev/sdb1 2884284108 218826068 2518944764 8% /data1 none 0 0 0 - /proc/sys/fs/binfmt_misc2.3 实战磁盘使用率与 inode 监控在脚本场景中df -h常与管道、awk 组合使用提取关键字段。仓库中的 codes/shell/进阶脚本/系统快照报告.sh 展示了如何监控指定磁盘的使用率for DISK in $DISK_TO_MONITOR # loop to check disk space do echo -e $DISK usage: \c df -h $DISK | sed -n /% \//p | gawk { print $5 } donecodes/linux/sys/syscheck.sh 中的get_disk_info函数则更进一步同时输出磁盘分区使用率与 inode 使用情况disk_use$(df -hTP | awk $2!tmpfs{print}) disk_inode$(df -hiP | awk $1!tmpfs{print})这里使用df -hTP-T显示文件系统类型-P使用 POSIX 输出格式排除 tmpfs 后再打印df -hiP则显示 inode 使用情况——当文件数量过多如小文件海量堆积时即使空间未满inode 耗尽同样会导致磁盘无法写入。3. du查看文件与目录占用空间du命令同样用于查看空间使用情况但与df不同的是du针对的是文件和目录所占用的磁盘空间统计粒度更细。3.1 基础用法# 显示目录或者文件所占空间 rootlocalhost [test]# du 608 ./test6 308 ./test4 4 ./scf/lib 4 ./scf/service/deploy/product 4 ./scf/service/deploy/info 12 ./scf/service/deploy 16 ./scf/service 4 ./scf/doc 4 ./scf/bin 32 ./scf 8 ./test3 1288 .输出左侧为占用的磁盘块数量默认 512 字节块可通过-k改为 KB右侧为文件或目录路径。du默认会递归列出所有子目录。3.2 常用用法# 显示指定文件所占空间 [rootlocalhost test]# du log2012.log 300 log2012.log # 查看指定目录的所占空间 [rootlocalhost test]# du scf 4 scf/lib 4 scf/service/deploy/product 4 scf/service/deploy/info 12 scf/service/deploy 16 scf/service 4 scf/doc 4 scf/bin 32 scf # 显示多个文件所占空间 [rootlocalhost test]# du log30.tar.gz log31.tar.gz 4 log30.tar.gz 4 log31.tar.gz # 只显示总和的大小 [rootlocalhost test]# du -s 1288 . [rootlocalhost test]# du -s scf 32 scf-ssummarize只显示总计是定位哪个目录占用最多空间最常用的方式通常与sort -rn组合对结果排序。3.3 实战统计目录占用 TOP10仓库中的 codes/linux/tool/查看指定目录磁盘使用情况.sh 是du的经典组合应用——对多个目录统计磁盘占用并输出 Top Tenfor DIR in ${DIRS} do echo echo The ${DIR} Directory: du -S ${DIR} 2 /dev/null | sort -rn | sed {11,$D; } | sed N; s/\n/ / | gawk {printf $1 : \t $2 \t $3 \n} done该脚本先用du -S-S不计入子目录大小只统计目录自身统计各子目录大小通过sort -rn按数字倒序排序再用sed截取前 10 行最后用gawk格式化输出。使用时只需配置DIRS变量例如/var/log /home /opt即可快速找出每个目录下最占空间的子目录。4. top实时监控系统整体运行状态top命令可以实时动态地查看系统的整体运行情况是一个综合了多方信息监测系统性能和运行信息的实用工具其互动式界面支持用热键管理进程。4.1 输出字段详解top - 09:44:56 up 16 days, 21:23, 1 user, load average: 9.59, 4.75, 1.92 Tasks: 145 total, 2 running, 143 sleeping, 0 stopped, 0 zombie Cpu(s): 99.8%us, 0.1%sy, 0.0%ni, 0.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 4147888k total, 2493092k used, 1654796k free, 158188k buffers Swap: 5144568k total, 56k used, 5144512k free, 2013180k cached逐段拆解统计信息行09:44:56为当前系统时间16 days表示系统已运行 16 天1 user为当前登录用户数load average: 9.59, 4.75, 1.92为系统负载即任务队列的平均长度分别对应过去 1 分钟、5 分钟、15 分钟。Tasks 行145 total总进程数2 running正在运行的进程数143 sleeping睡眠的进程数0 stopped停止的进程数0 zombie僵尸进程数。Cpu(s) 行us用户空间占用 CPU 百分比sy内核空间占用 CPU 百分比ni用户进程空间内改变过优先级的进程占用 CPU 百分比id空闲 CPU 百分比wa等待输入/输出的 CPU 时间百分比hi硬件中断hardware interrupts百分比si软件中断software interrupts百分比st被 hypervisor 偷走的 CPU 时间steal time常见于虚拟机。Mem 行total物理内存总量used已使用物理内存free空闲内存buffers用作内核缓存的内存量。Swap 行total交换区总量used已使用交换区free空闲交换区cached被缓存的内存总量。4.2 命令行选项top(选项) -b以批处理模式操作 -c显示完整的命令行 -d屏幕刷新间隔时间 -I忽略失效过程 -s保密模式 -S累积模式 -i时间设置间隔时间 -u用户名指定用户名 -p进程号指定进程 -n次数循环显示的次数。4.3 top 交互命令在 top 执行过程中可以使用以下单字母交互命令若在命令行中使用了-s选项其中一些命令可能会被屏蔽h显示帮助画面给出一些简短的命令总结说明 k终止一个进程 i忽略闲置和僵死进程这是一个开关式命令 q退出程序 r重新安排一个进程的优先级别 S切换到累计模式 s改变两次刷新之间的延迟时间单位为s如果有小数就换算成ms。输入0值则系统将不断刷新默认值是5s f或者F从当前显示中添加或者删除项目 o或者O改变显示项目的顺序 l切换显示平均负载和启动时间信息 m切换显示内存信息 t切换显示进程和CPU状态信息 c切换显示命令名称和完整命令行 M根据驻留内存大小进行排序 P根据CPU使用百分比大小进行排序 T根据时间/累计时间进行排序 w将当前设置写入~/.toprc文件中。4.4 实战批处理模式抓取 CPU/内存 TOP10top的-b批处理与-n次数选项配合可以在非交互环境下抓取快照非常适合写进巡检脚本。仓库 codes/linux/sys/syscheck.sh 中的get_process_top_info函数即为此用法top_title$(top -b n1 | head -7 | tail -1) cpu_top10$(top -b n1 | head -17 | tail -11) mem_top10$(top -b n1 | head -17 | tail -10 | sort -k10 -r)其中top -b n1表示以批处理模式仅执行一次再配合head/tail/sort截取标题行与 CPU/内存占用前 10 名的进程。sort -k10 -r按第 10 列%MEM内存占用百分比倒序排列得到内存占用 TOP10。5. free查看内存使用情况free命令可以显示当前系统未使用的和已使用的内存数目还可以显示被内核使用的内存缓冲区。5.1 语法与选项free(选项) -b # 以Byte为单位显示内存使用情况 -k # 以KB为单位显示内存使用情况 -m # 以MB为单位显示内存使用情况 -g # 以GB为单位显示内存使用情况 -o # 不显示缓冲区调节列 -s间隔秒数 # 持续观察内存使用状况 -t # 显示内存总和列 -V # 显示版本信息。5.2 输出解读三行数据的含义free -t # 以总和的形式显示内存的使用信息 free -s 10 # 周期性的查询内存使用信息每10s 执行一次命令 free -m total used free shared buffers cached Mem: 2016 1973 42 0 163 1497 -/ buffers/cache: 312 1703 Swap: 4094 0 4094第一部分 Mem 行解释total内存总数used已经使用的内存数free空闲的内存数shared当前已经废弃不用buffersBuffer缓存内存数cachedPage缓存内存数。关系total used free。第二部分-/ buffers/cache解释(-buffers/cache) used内存数第一部分 Mem 行中的used - buffers - cached(buffers/cache) free内存数第一部分 Mem 行中的free buffers cached。可见-buffers/cache反映的是被程序实实在在吃掉的内存而buffers/cache反映的是可以挪用的内存总数。第三部分是交换分区也就是通常所说的虚拟内存。5.3 从 OS 与应用程序两个角度理解内存第二行Mem与第三行-/ buffers/cache的 used/free 区别本质是观察角度的不同第一行是从OS 的角度来看对操作系统而言buffers/cached 都属于已被占用所以它的可用内存是free本身已用内存包含了内核OS使用 Application 使用的 buffers cached。第三行是从应用程序的角度来看对应用程序而言buffers/cached 是可用的因为 buffer/cache 是为了提高文件读取的性能而存在当应用程序需要用到内存时buffer/cache 会很快地被回收。所以从应用程序的角度来说可用内存 系统 free memory buffers cached。5.4 深入/proc/meminfo 与交换机制free的数据来源于内核导出的/proc/meminfo虚拟文件可以cat /proc/meminfo查看更细粒度的内存指标cat /proc/meminfo MemTotal: 16140816 kB MemFree: 816004 kB MemAvailable: 2913824 kB Buffers: 17912 kB Cached: 2239076 kB SwapCached: 0 kB Active: 12774804 kB Inactive: 1594328 kB AnonPages: 12229228 kB Mapped: 117136 kB Shmem: 58736 kB Slab: 395568 kB SReclaimable: 246700 kB SUnreclaim: 148868 kB PageTables: 165104 kB CommitLimit: 16262404 kB Committed_AS: 27698600 kB VmallocTotal: 34359738367 kB VmallocUsed: 311072 kB HugePages_Total: 0 Hugepagesize: 2048 kB DirectMap4k: 225536 kB DirectMap2M: 13279232 kB DirectMap1G: 5242880 kB当可用内存少于额定值时内核会进行交换swap。交换通过三个途径减少系统中使用的物理页面的个数减少缓冲与 page cache 的大小将系统 V 类型的内存页面交换出去换出或者丢弃页面Application 占用的内存页即物理内存不足的情况。事实上少量地使用 swap 并不会影响系统性能。5.5 buffers 与 cached 的区别那 buffers 和 cached 都是缓存两者有什么区别呢为了提高磁盘存取效率Linux 除了对 dentry 进行缓存用于 VFS加速文件路径名到 inode 的转换还采取了两种主要的 Cache 方式Buffer Cache和Page Cache。前者针对磁盘块的读写后者针对文件 inode 的读写这些 Cache 有效缩短了 I/O 系统调用如 read、write、getdents的时间。Page cache 是针对文件系统的是文件的缓存文件层面上的数据会缓存到 page cache。文件的逻辑层需要映射到实际的物理磁盘这种映射关系由文件系统完成当 page cache 的数据需要刷新时数据会交给 buffer cache。这种处理在 2.6 版本的内核之后就变得很简单了没有真正意义上的独立 cache 操作。Buffer cache 是针对磁盘块的缓存在没有文件系统的情况下直接对磁盘进行操作的数据会缓存到 buffer cache 中例如文件系统的元数据。简单说来page cache 用来缓存文件数据buffer cache 用来缓存磁盘数据。在有文件系统的情况下对文件操作数据会缓存到 page cache如果直接采用dd等工具对磁盘进行读写数据则会缓存到 buffer cache。运维判断标准只要不用 swap 交换空间就不用担心自己的内存太少如果 swap 经常用很多可能就要考虑增加物理内存了。如果是应用服务器一般只看第二行buffers/cache——对应用程序来说 free 的内存太少就该考虑优化程序或加内存了。5.6 实战脚本中计算内存使用率在脚本中free常与sed/gawk组合提取内存使用率。仓库 codes/shell/进阶脚本/系统快照报告.sh 与 codes/linux/sys/syscheck.sh 均采用如下写法free | sed -n 2p | gawk x int(($3 / $2) * 100) {print x} | sed s/$/%/思路是取free输出的第 2 行Mem 行用$3/$2used/total计算内存使用率百分比。syscheck.sh的get_mem_info函数还结合/proc/meminfo输出总容量与剩余量单位换算为 MBcheck_mem$(free -m) MemTotal$(grep MemTotal /proc/meminfo | awk {print $2}) #KB MemFree$(grep MemFree /proc/meminfo | awk {print $2}) #KB let MemUsedMemTotal-MemFree report_MemTotal$((MemTotal/1024)) MB6. iotop按进程监控磁盘 I/Oiotop命令是一个用来监视磁盘 I/O 使用状况的 top 类工具。iotop 具有与 top 相似的 UI其中包括 PID、用户、I/O、进程等相关信息。Linux 下的 IO 统计工具如 iostat、nmon 等大多数只能统计到 per 设备的读写情况如果想了解每个进程是如何使用 IO 的就比较麻烦使用 iotop 可以很方便地查看。6.1 安装方式iotop 使用 Python 语言编写要求 Python 2.5及以上版本和 Linux 内核 2.6.20及以上版本。Ubuntuapt-get install iotopCentOSyum install iotop编译安装wget http://guichaz.free.fr/iotop/files/iotop-0.4.4.tar.gz tar zxf iotop-0.4.4.tar.gz python setup.py build python setup.py install6.2 语法与选项iotop选项 -o只显示有io操作的进程 -b批量显示无交互主要用作记录到文件。 -n NUM显示NUM次主要用于非交互式模式。 -d SEC间隔SEC秒显示一次。 -p PID监控的进程pid。 -u USER监控的进程用户。6.3 常用交互快捷键左右箭头改变排序方式默认是按 IO 排序r改变排序顺序o只显示有 IO 输出的进程p进程/线程的显示方式的切换a显示累积使用量q退出。6.4 输出示例直接执行 iotop 即可看到效果Total DISK read: 0.00 B/s | Total DISK write: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO command 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init [3] 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd] 3 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0] 4 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0] 5 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0] 6 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1] 7 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/1] 8 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/1] 9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [events/0] 10 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [events/1] 11 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khelper] 2572 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [bluetooth]字段说明TID为线程 IDPRIO为优先级USER为进程属主DISK READ/DISK WRITE为该进程每秒读/写的磁盘量SWAPIN为交换等待时间百分比IO为 I/O 等待时间百分比command为进程命令。顶部两行给出整机磁盘读写的总速率。6.5 与其他 I/O 工具的分工当需要按设备维度而非进程维度观察 I/O 时可配合 docs/linux/cli/iostat.md 中介绍的iostat如iostat -x /dev/sda1查看扩展状态关注await平均等待时间、%util设备利用率等指标系统整体内存/CPU 快照可参考 docs/linux/cli/vmstat.md 中的vmstat关注r运行队列、si/so换入换出、waI/O 等待等字段。三者互为补充iotop定位哪个进程在读写iostat定位哪块设备忙vmstat定位系统整体压力。7. 综合实战把五大命令接入巡检与归档脚本硬件监控命令的高频价值在于脚本化与自动化。本仓库提供了多个可直接参考的落地示例系统巡检codes/linux/sys/syscheck.sh 是一个交互式系统信息检查脚本通过菜单选择即可分别输出 CPU 信息/proc/cpuinfo、内存信息free -m、磁盘信息df -hTP、CPU/内存占用 TOP10top -b n1或将全部信息汇总输出到sys.log一键完成硬件体检。定时快照codes/shell/进阶脚本/系统快照报告.sh 演示了将df -h、free、uptime、ps -al的结果重定向到按日期命名的报告文件中并通过exec 13恢复标准输出是生成每日系统报告的成熟模板。空间排行codes/linux/tool/查看指定目录磁盘使用情况.sh 基于du -S输出各目录空间占用 TOP10。工具部署codes/linux/sys/install-tools.sh 通过yum install -y coreutils提供 df、du、yum install -y iotop等命令可在新机器上一键补齐硬件监控所需的全部命令工具。结合 docs/linux/ops/crontab.md 中介绍的 crontab即可将这些脚本固化为周期任务形成日常巡检 定期快照 空间排行的硬件管理闭环。8. 小结命令核心能力关键选项定位场景df文件系统磁盘空间-h、-a、-T、-i磁盘是否满、inode 是否耗尽du文件/目录占用空间-s、-S、-k找出最占空间的目录/文件top系统整体运行状态-b、-n、-u、-pCPU/内存实时监控、进程排序free内存与交换分区-m、-s、-t内存是否够用、swap 压力iotop进程级磁盘 I/O-o、-b、-d、-p定位高 I/O 进程掌握这五大命令并善用仓库中的脚本模板即可系统化地完成 Linux 硬件资源的监控、排查与报表化输出。【免费下载链接】linux-tutorial:penguin: Linux教程主要内容Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表