干了多年Linux运维平时记了不少笔记前段时间整理了一波自己常用的高级命令发现这些命令散落在各个博客和手册里真正组合起来用的时候特别顺手。这篇就从网络、进程、磁盘、防火墙四个方向把我实测过、踩过坑的命令和排查思路一次性拉出来方便自己回看也给刚接触运维的朋友做个参考。内容偏实战每个命令都尽量说清楚“为什么要这么用”而不是只列一堆参数。1. 网络命令从连通性到流量分析一条链路排查到底网络问题通常不是单独的某一个命令能搞定的而是靠多个命令组合、逐层缩小范围。我习惯先看网络配置和路由再看连接状态和实际流量最后用抓包定位应用层问题。这几个命令足够覆盖日常90%的网络故障。1.1 先搞清楚网络配置与路由状态ip命令是ifconfig的超集现在主流发行版都用它来管理网络。查看所有网卡IPip addr show加上-br参数能一行显示一个网卡看状态特别方便ip -br addr show这条输出里每一行会是eth0 UP 192.168.1.10/24这样的格式UP/DOWN一目了然。排查网卡没起来的时候这条命令比ifconfig好用得多因为输出紧凑。路由表用ip route查看也可以写成route -n。我一般用后者因为直接显示数字IP不用解析主机名带宽占用也小ip route show route -n当默认路由丢失时输出里只有一行Kernel IP routing table而没有default那基本就是上不了网的关键原因。修复临时默认路由可以这样ip route add default via 192.168.1.1 dev eth0DNS问题也是高频问题。/etc/resolv.conf被NetworkManager重写是常态排查时先确认这个文件里nameserver是否正常再用手动的dig或nslookup验证解析是否真的生效比如dig short www.example.com nslookup www.example.com注意如果服务器是静态IP配置但是resolv.conf被清空非常容易造成“网络通、域名解析不了”的诡异现象这种情况优先检查NetworkManager或systemd-resolved是否接管了DNS。1.2 端口与连接状态排查ss、netstat与lsof以前用netstat的人多但ss在连接数多时性能要好很多默认安装iproute2就有。查监听端口ss -lntp参数拆解-l只看监听状态-n不解析域名-t只看TCP-p显示进程信息。这样输出就能看到哪个进程在监听哪个端口排查端口占用特别直接。如果想看所有TCP连接包括ESTABLISHED、TIME_WAIT等状态ss -antp | head -50head是防止连接数太多刷屏。统计各种连接状态的数量也非常实用我经常用一行awk完成ss -ant | awk {print $1} | sort | uniq -c | sort -rn组合命令的含义是先列出所有TCP连接的第一列状态比如LISTEN、ESTAB再排序、去重、计数。有时候服务器TIME_WAIT状态连接很多这就是为什么ss比netstat更好用的场景因为ss输出快、不卡。某个端口被占时用lsof查对应的进程最直观lsof -i :8080输出里PID和COMMAND直接能看出来比如java 1234 user 21u IPv4 ...。lsof找不到时会提示没有输出这时候就要注意是不是权限不够普通用户看不到其他人的进程必须加sudo。1.3 抓包与临时性测速说到网络故障排查tcpdump是杀手锏。抓包之前先了解网卡名比如eth0然后:tcpdump -i eth0 -nn port 80 -c 100意思是抓eth0上端口80的流量-c 100只抓100个包后就退出避免刷屏。-nn表示不解析域名和端口号速度更快。如果要存下来用wireshark分析加-w参数tcpdump -i eth0 -w /tmp/eth0.pcap port 443抓包文件我们可以用tcpdump自己读也可以下载后用wireshark图形化看。必须强调一点在业务高峰期抓包前请先看流量大小用-c限制包数量或者-s0限制包大小不然/var分区很容易被撑爆。网络测速方面很多新环境没有iperf3我习惯先用curl -w测一下HTTP下载速度curl -o /dev/null -s -w speed: %{speed_download} B/s, time: %{time_total}s\n http://mirror.example.com/file.bin-o /dev/null是丢弃下载内容-s静默-w自定义输出模板。这个命令能快速判断出带宽是否够用。如果对网卡物理带宽和二层包转发率有疑问用ethtool看协商状态ethtool eth0输出里“Speed: 1000Mb/s”和“Duplex: Full”是最关键的两个字段如果显示协商成100Mb/s或半双工说明网线质量或者网卡驱动有问题需要优先处理。1.4 网络命令的常见坑与自查思路第一类问题查询监听端口明明能看到但外网就是连不上。这种情况先确认防火墙后面章节专门讲再确认服务绑定地址是0.0.0.0还是127.0.0.1。很多服务默认只绑localhost外部当然连不上用ss -lntp看到127.0.0.1:6379就说明没开对地址。改成0.0.0.0或配置具体内网IP才能暴露。第二类问题ping不通但业务正常。很多人第一反应是网络断了实际上很多云环境或IDC会禁ICMP所以ping不通不代表网络有问题。这时候改用telnet ip port或nc -vz ip port来测TCP连通性更可靠nc -vz 192.168.1.20 22看到Connection to 192.168.1.20 22 port [tcp/ssh] succeeded!才算服务端口可达。第三类问题DNS解析时好时坏。正好上面说过先查/etc/resolv.conf再查缓存。很多公司内部的DNS有负载均衡策略但偶尔某个上游不同步建议多配置两个nameserver并用dig分别指向不同DNS测试dig 8.8.8.8 www.example.com这种问题排查起来容易钻死胡同一定要靠现象驱动别靠猜。2. 进程管理定位CPU、内存、IO消耗的元凶服务器出故障最先该看的就是进程。作为“自用”笔记我把进程相关命令分成三个层次查看概览、深入分析、动态追踪。2.1 进程查看与统计ps、top与pstreeps是最基础的进程查看命令但很多人只用ps -ef那样看不到CPU和内存占比所以排查性能问题时我会直接用ps auxps aux --sort-%cpu | head -20这条命令按CPU占用率从高到低排序进程耗CPU的元凶一眼就能看到。想按内存排序就把-%cpu换成-%mem。%cpu和%mem最右侧的时间是累计运行时间这个字段能辅助判断进程是不是刚启动就炸还是长期消耗。top交互式工具适合持续观察。进入top后按P按CPU排序按M按内存排序按c显示完整命令行。有时候CPU占用率一直在100%但看不出哪个线程干的活多这时候在top里按H开启线程模式可以看到每个线程的CPU占用CPU密集型的排查从线程级别入手更准。pstree看父子进程关系特别有用pstree -p | grep nginx当服务起不来时看相关进程是否有僵尸状态[defunct]。僵尸进程是父进程没有调用wait回收的产物大量僵尸堵着会让新进程创建失败。pstree能快速理清谁是谁的父进程帮你决定该重启谁、该喂信号给谁。2.2 性能数据采集vmstat、iostat与sar只看单次快照还不够性能问题往往需要采集一段趋势。vmstat是经典的内存、CPU、IO概览命令vmstat 1 10每秒采集一次连续10次。输出里的r列是阻塞进程数b列是等待IO的进程数si/so是内存换入换出如果si/so长期不为0说明物理内存不足系统在疯狂swap负载看起来不高但响应很慢。磁盘IO的详细数据用iostatiostat -x 1 5注意看util列是否接近100%await是否飙高。如果磁盘util很高说明磁盘是真瓶颈如果util不高但io等待很高可能问题出在锁竞争、文件系统配置或上层应用。iostat输出里w_await和r_await分别代表写读延迟数据量越大越能反映真实情况。跨天采集的话sar是必须安装的工具通常叫sysstat包。默认10分钟采一次存到/var/log/sa/第二天看昨天的数据sar -u sar -r sar -b-u看CPU-r看内存-b看磁盘IO。这种历史数据对复盘“昨天半夜到底发生了什么”特别有用。2.3 进程追踪与信号控制kill、killall与等待把进程搞挂最常用的是kill。但要清楚kill默认就是发送TERM信号(15)请进程自己优雅退出只有进程不响应时才用kill -9强制杀掉。直接kill -9容易丢数据、留下脏状态比如某些服务在正常情况下可以做checkpoint被强制杀之后恢复起来要重建索引。找到要结束的进程除了ps查PID更常用的方式是pgreppgrep -f nginx: worker然后批量结束同名的用pkillpkill -f app.jar注意pkill -f会匹配完整命令行这可能导致误杀。我踩过坑用pkill -f test会连带杀掉很多命令行里有test的无关进程。所以建议先pgrep -af打印出要匹配的完整命令行确认再执行pkill。等待进程结束还有个冷门但好用的wait命令。在脚本里启动后台进程然后等待它结束sleep 10 wait $!如果在脚本里直接wait某个job ID可以避免脚本流程提前往下跑。wait $!是最常见的用法$!保存的是最近一个后台进程的PID。高级诊断上strace跟踪系统调用perf做性能采样。比如猜某个程序为什么卡在IO上strace -p 1234 -e traceopenat,read,write -f-p附加指定PID-e trace限定系统调用类型-f跟随子进程。生产环境用strace要格外小心CPU消耗会上升我一般只attach短时间采样完马上detach。perf top则用于采样CPU热点函数定位是用户态还是内核态耗CPU。2.4 进程监控的实战经验排查CPU飙高的具体流程我通常是这样先用top -b -n1 | head -20拍一张快照再用ps aux --sort-%cpu | head -5确认具体哪个进程如果只有某个worker高而主进程不高就用top -Hp PID查看线程再用jstackJava应用或perf采样得到函数栈。这套流程比直接一上来就kill要踏实得多。内存方面有个容易被忽略的坑free -h看到的used包括了cache和buffer很多人以为内存满了其实cache是可以回收的。判断内存是否真的吃紧要看free输出的available列或者看swap的使用趋势。如果free显示available长期很低、swap持续上涨那才是真正内存告急。进程数也有上限约束ulimit -u是用户最大进程数sysctl kernel.pid_max是系统最大PID数。很多环境默认pid_max是32768一旦进程数突破这个值系统会直接拒绝创建新进程日志会报Resource temporarily unavailable。遇到这种情况优先检查是否有大量的等待/僵尸/D进程而不是盲目调高pid_max。3. 磁盘管理容量、分区、IO一把抓磁盘问题最明显的是空间满了其次是IO性能差、分区格式不对、无法挂载。我把这几个点分开讲。3.1 查看容量与定位大文件df和du查看磁盘空间占用最常用的命令就是df -hdf -h-h是人性化显示输出的各列中注意Mounted on对应的挂载点。如果某个分区使用率100%但用du统计文件却对不上账大概率是有已删除但仍被占用的文件。怎么找到这些文件用lsof | grep deletedlsof L1L1会列出link count为0但仍打开的已删除文件。这些文件虽然目录里看不到但空间一直没释放处理方式是找到对应进程并重启它。顺着目录找大文件用dudu -sh /var/log/* | sort -rh | head -10du -sh是汇总每个目录的大小再用sort倒序排列。du统计的是实际磁盘占用这里和文件系统上显示的“文件大小”会略有不同因为要算块对齐特别是小文件多的时候du的结果可能远大于ls统计的字节数。3.2 分区与挂载lsblk、fdisk与blkid查看分区结构推荐lsblk输出清爽不废话lsblk列出的NAME里可能有nvme0n1这种设备名下面p1、p2是分区。要看文件系统类型和UUID用blkidblkid输出里“TYPExfs”或“TYPEext4”就是格式化时的文件系统类型。挂载新磁盘通常分三步给新加的硬盘分区fdisk /dev/sdb格式化mkfs.ext4 /dev/sdb1挂载mount /dev/sdb1 /data。生产环境挂载前最好先编辑/etc/fstab加上UUID方式挂载千万别用设备名因为重启后设备名可能变化。分区调整时很多人害怕fdisk的交互菜单。其实关键就几步按n新建分区按p主分区按1分区号然后回车选择默认起止扇区最后按w保存退出。这套流程做过两三次就熟了。还有一种“磁盘必须经过初始化逻辑磁盘管理器才能访问”的情况一般出现在Windows系统里但Linux下也有类似现象新买的云硬盘或物理盘插上之后没有分区表lsblk能看到整块盘但里面没有分区这时候fdisk /dev/sdb新建分区再格式化成目标文件系统即可。顺带提示partprobe命令让内核重新读取分区表避免执行完fdisk还要重启才能识别新分区。3.3 磁盘IO瓶颈定位与测试日常观察磁盘IO是否成为瓶颈还是推荐iostat -x 1。这里的%util指标虽然直观但要注意如果是SSD或NVMeutil接近100%也不一定代表性能瓶颈因为NVMe支持多队列并发单个队列百分比和普通磁盘不太一样。更可靠的指标是“平均请求队列长度”和“await”当await时间持续升高时说明IO响应变慢了。查看实时磁盘IO流量iostat -k 2能每秒打印读写KB数。如果只关心某个进程的磁盘读写用iotop需要root权限iotop -Pak-P只显示进程-a累计-k用KB显示。这个工具能一眼看到是哪个进程在疯狂写数据。实测写性能时最常用的工具是dd比如写一个1G的测试文件dd if/dev/zero of/tmp/testfile bs1M count1024 oflagdirect这里oflagdirect是重点表示绕过文件系统缓存直接写磁盘测出来才是真实的磁盘写性能。如果不加direct实际上写到缓存里就返回了速度会被缓存夸大很多倍。读性能测试直接把if和of反过来从/tmp/testfile读到/dev/null。挖个更深的坑当你用dd测试时性能很好但实际应用IO延迟依然高。可能是文件系统挂载参数不合适比如日志模式ext4的datawriteback和dataordered性能差别很大或者RAID策略不对。这时候要结合应用层日志和存储层监控一起看别只看单点数据。3.4 磁盘相关的排错经验“No space left on device”不一定真是磁盘满有时候是inode满了。用df -i查看inode使用率如果inode使用率接近100%即使空间还剩很多也无法创建新文件。这种多半因为目录里小文件太多比如很多程序的缓存目录。解决策略是把小文件归档成一个大文件比如打包压缩。还有一种情况是分区挂载丢失。mount时提示“special device /dev/sdb1 does not exist”先lsblk看内核是否识别到再fdisk -l /dev/sdb看分区是否存在。排查顺序不要乱否则容易白忙。对于临时加挂的盘建议用mount -a测试fstab配置是否正确避免改错fstab导致开机后系统进不了单用户模式。真改错了也别慌重启时按e进入grub编辑在linux行末加single或init/bin/bash进去后注释掉错误的fstab行。这套操作是老运维的基本功遇到过一次就能记一辈子。4. 防火墙从iptables到firewalld再到nftables如果说网络、进程、磁盘都是“查问题”防火墙则是“制造问题”的重灾区。很多服务部署好了连不通最后发现都是防火墙规则没放行。这里把iptables和firewalld都过一遍还要讲清楚它们之间的关系。4.1 iptables基础与规则链理解iptables是Linux内核netfilter框架的用户态管理工具。链链之间是有顺序的数据包从进来到出去会依次经过PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING这几条链。日常最常用的是INPUT和OUTPUT链。查看当前规则iptables -L -n --line-numbers-L列出规则-n不解析IP和端口--line-numbers显示行号这方便后续按编号删除。默认策略看最后一行iptables -P INPUT DROP把默认策略改成DROP后务必小心改之前一定要确保当前SSH连接有放行规则并且还有第二个管理通道否则一敲回车可能直接断连。我见过太多新人因为这条命令把自己锁在服务器外面。简单放行一条规则iptables -A INPUT -p tcp --dport 22 -j ACCEPT-A追加-p协议--dport目标端口-j满足条件后动作。放行IP段iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT删除某条规则用之前--line-numbers查到的行号iptables -D INPUT 3这条是“删除INPUT链第3条规则”比复制整条规则反着写可靠得多。iptables还有“黑白名单”的概念黑名单就是默认放行只拒绝特定来源白名单是默认拒绝只放行特定来源。生产环境一般用白名单策略即使配置麻烦点安全性高不少。4.2 firewalld的常用操作与误区RHEL/CentOS 7以后默认用firewalld它底层其实还是调用iptables只是上层多了zone概念。查看当前zonefirewall-cmd --get-active-zones常用命令先记住几个firewall-cmd --state # 查看运行状态 firewall-cmd --list-all # 查看当前zone所有规则 firewall-cmd --zonepublic --add-port8080/tcp --permanent # 放行8080端口 firewall-cmd --zonepublic --add-servicehttp --permanent # 放行http服务 firewall-cmd --reload # 重新加载配置--permanent参数特别容易踩坑只加这个参数不reload不会生效只reload但没加--permanentreload后规则就丢了。我自己的习惯是两条命令连着敲firewall-cmd --add-port8080/tcp --permanent firewall-cmd --reload还有一种常见需求黑名单/白名单IP。firewalld可以加富规则firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.1.10 accept比如禁止某个IP访问22端口firewall-cmd --permanent --add-rich-rulerule familyipv4 source address10.0.0.5 port port22 protocoltcp reject富规则语法稍微复杂但实际用起来很灵活适合做精细访问控制。如果你不想记住firewalld的花哨命令也可以直接回到iptables层面操作但要注意firewalld启动时可能会覆盖或合并你的iptables规则比如CentOS7默认firewalld和iptables服务是互斥的开了firewalldsystemctl start iptables可能不起作用。4.3 nftables与现代安全趋势新一代基于内核的nftables逐渐在RHEL9、Debian 12等新系统里成为默认它兼容并简化了iptables的语法同时性能更好。但真正把iptables语法迁移到nftables还是有不少差异特别是链和表的概念变了。平时如果遇到新版系统先用nft list ruleset查看当前规则nft list rulesetnftables命令示例例如允许22端口nft add rule inet filter input tcp dport 22 accept其中inet filter input是“表链”的路径。虽然nftables是趋势但很多存量环境还是iptables所以两个系列都要会不能说新版系统默认nftables就把老知识丢掉了因为大量教程和脚本还是旧语法遇到问题时两边切换要能转过来。4.4 防火墙排查思路与黑名单/白名单管理防火墙导致不通的典型现象是外部telnet端口超时但本机ss -lntp能看到端口在监听。这时先把防火墙临时关掉试一下前提是物理机或虚拟机环境安全快速判断是不是防火墙的问题systemctl stop firewalld如果关了之后连接正常那基本就确认规则没放行。别忘了查完后把防火墙再开回来systemctl start firewalld我用一个更稳妥的候选方法是先放行所有来自某个管理网段的流量iptables -I INPUT -s 192.168.1.0/24 -j ACCEPT这样即使我后续清空规则或误删依然能通过管理网段连上。黑白名单的维护建议用独立脚本管理把通用规则放在脚本里别直接在命令行一条一条手敲。因为手敲规则多了以后容易出现规则顺序错乱找到问题时已经不知道哪条冲突。脚本里用iptables-restore批量导入规则每次修改后先测试再上线是比较稳妥的做法。5. 常用组合命令与自用速查清单最后整理一份我平时贴在手边的速查清单都是组合命令适合快速复制使用。# 查看网络连接数排名前10的IP ss -ant | awk {print $5} | awk -F: {print $1} | sort | uniq -c | sort -rn | head -10 # 查看当前TCP各种状态统计 ss -ant | awk NR1{print $1} | sort | uniq -c # 查看占用内存前5的进程 ps aux --sort-%mem | head -6 # 查看当前线程数最多的进程 ps -eLf | awk {print $2} | sort | uniq -c | sort -rn | head -5 # 查找大于500M的文件 find / -type f -size 500M -exec ls -lh {} \; 2/dev/null # 查看每个进程打开的fd数量 lsof -n | awk {print $1} | sort | uniq -c | sort -rn | head # 捕获某个端口流量5秒存成pcap timeout 5 tcpdump -i eth0 -w /tmp/cap.pcap port 8080 # 查看系统负载并持续观察 vmstat 1 5 # 查看实时磁盘IO iostat -x 1 3 # 抓包统计某个IP的包数量 tcpdump -i eth0 -nn src host 10.0.0.1 -c 1000 | wc -l这些组合命令看起来简单但都是实际排障时的“肌肉记忆”。比如“查看每个进程打开的fd数量”一旦遇到too many open files错误马上用它定位是哪个进程在疯狂消耗文件描述符然后再用lsof -p PID看具体文件。核心思路是先定位进程再看进程内部具体做什么。文件描述符限制和防火墙端口范围等系统级限制也是高级运维必须掌握的点。查看当前进程fd上限cat /proc/1234/limits | grep open files修改单个进程的限制可以直接用ulimit -n 65535持久化改/etc/security/limits.conf。如果服务端进程是systemd管理的还需要在service文件里加LimitNOFILE字段。关于防火墙端口范围内核参数net.ipv4.ip_local_port_range决定客户端发起连接时使用的本地端口范围默认一般是32768~60999。如果短连接特别多本地端口耗尽也会导致连接失败表现为Cannot assign requested address。临时调大echo 1024 65535 /proc/sys/net/ipv4/ip_local_port_range持久化的话写入/etc/sysctl.conf再sysctl -p执行。这个优化点特别适合连接数大且都是短连接的场景比如API服务。6. 写在最后的一点个人经验这些命令单独看都简单难的是把它们串成一套排查思路。我自己总结的规律是网络不通先用ip addr确认本地配置用route -n确认路由用ss -lntp确认服务端口用tcpdump确认数据包到底有没有到达网卡进程问题先看top再定位到PID必要时用strace跟进系统调用磁盘问题先看df -h排除空间再用iostat -x判断是否IO瓶颈防火墙问题则假设它可能拦截用停服测试或临时放行来确认。这套流程熟记之后大部分生产故障都能在十分钟内找到方向。最后分享一个小技巧排查过程中要把每个命令的时间点都记录清楚比如抓包开始时间、sar采样时间。因为很多故障是偶发的等事后再复盘时只有对应的时间点数据才有意义没有时间线所有监控数据都是一堆无用的数字。我在运维笔记里始终坚持“先定位时间再定位代码”这样能省下无数个加班夜。