先从性能检查小工具着手
查看系统负载摘要 - w, top, free(linux)
准实时更新的系统负载摘要 - top, vmstat, iostat
进程查看 - top, ps, lsof
进程跟踪 - strace (truss), ltrace
网络连接情况 - netstat, lsof
文件打开情况 - lsof, fuser
Linux下万金油 - ls, cat (with /proc)
查看历史 - sar
以下是一些小 tip
1. Linux 下多数人会使用 netstat -ant |wc -l 或 netstat netstat -ant|grep EST |wc -l 这样的命令来查看当前连接的摘要情况。netstat 扫描很费时间,快速、准确、在系统反应慢的时候尤其有利的方法
# cat /proc/net/sockstat
2. 查看当前系统负载最简单的命令是 w,这个命令在高负载,系统反应慢的情况下最可靠
3. strace -p 很强大,没有日志的情况下,它可以用来了解进程究竟在做什么
4. lsof 也很强大,lsof -n -i TCP:80 和 netstat -natp |grep :80 的效果基本相同,但揭示出额外的东西
5. top 不会排序,就不算会用,常用的排序是按内存用量排序和CPU使用时间排序,分别是按 M 和 P。按 s 可以改变更新间隔。按 h 可以看帮助。
转自校内王剑的日志
Unix 系统管理员的 n 种武器 (1)这些工具的使用顺序应该是这样的
1. 首先,看一下系统摘要,结合系统的用途,作出调查方向的初步判断。系统用途可以用 ps 看一下完整的进程列表;
2. 确定方向后,使用工具查看具体的问题;
3. 使用工具查找引起该具体问题的原因;
经验多了以后,第二步有时候可以省去,但注意可能会误入歧途。
更新:有些是 linux specific 的,注明一下
Unix 系统管理员的 n 种武器 (2)网络相关的工具
网络连接情况 - netstat, lsof
路由表 - route, ip(linux), netstat
查看和配置网络接口 - ifconfig, ip(linux)
网卡设备配置 - ethtool & mii-tool (linux)
网络链路质量检查 - ping, mtr, traceroute
网络包检查 - tcpdump, wireshark
流量监控 - iftop, iptraf, jnettop
万用TCP连接测试工具 - telnet, netcat (nc), openssl s_client
流量管理和控制 - tc (linux)
防火墙设置 - iptables(linux)
DNS查询工具 - host, nslookup, dig
Linux 下的万金油 - cat, echo (with /proc)
查看历史 - sar
下面是一些小 tip
1. netstat 的 -p 参数很有用,它可以显示 socket 对应的程序的 pid 和 程序名,我常常使用 netstat -ntlp 和 netstat -nulp 来检查守护进程
2. 检查路由表,netstat -nr 和 route -n 是差不多的,不过列有些差别。有些系统上 route 命令不能用来查看路由表,必须用 netstat -r。Linux 上,route -ne 等于 netstat -nr
3. ip 是个强大的命令,它可以用来检查和配置接口 IP 地址、检查和配置路由
ip addr ...
ip route ...
Linux的高级路由功能必须用 ip 命令来实现 (ip rule + ip route)
4. telnet 除了连接 telnet 服务外,还可以创建一个 tcp 连接并和服务器交互,这个功能和 netcat 相同。openssl s_client -connect server:port 用于建立 SSL 连接(耶,你可以和 https 服务交互)
5. tc 一般用来对流量进行优先级划分或做流量限制。在测试中可以用 tc qdisc change dev eth0 root netem ...... 来模拟网络延时和丢包等情况。在 10ms 延时和 0ms 延时的情况下,系统负载能力有质的区别。
6. 谨慎使用 iptables。除非你正在配置一个防火墙,否则能不用就不用。在一个大的服务器群里,一个没做公开记录的 iptables 规则很可能造成大的损失,外带人力浪费
7. mtr 比 traceroute 好
8. 检查网络问题时,ping -f 可能比 ping 好:ping 不丢包,而 ping -f 才显示出问题
9. 多数网络相关命令都带有 -n 参数(lsof 也有),禁用反向域名查询。反向域名查询很多时候会引起问题,诸如"tcpdump 为什么抓不到包","ping 怎么死了",而且很慢。用 -n 应该是下意识的,不需要别人提醒你,不过 mtr 例外,它的反向域名查询是异步的
10. tcpdump 必须熟悉,如果还没把 tcpdump 的 man page 通读一遍,赶紧的
11. 网线问题是你经常想不到但必须想的。ethtool 和 mii-tool 可以帮助你了解当前网线的连接状态。ethtool 还用于配置一些网卡驱动的参数,例如 TSO (Tcp segmentation offload),链路速度。强制设置网卡链路速率能解决问题,但更多的是引起问题,如难以解释的丢包。
12. sar -n XXX 可以用来了解历史
13. DNS 查询问题可能会引起一些看起来是网络问题的问题,例如浏览器慢,mysql 数据库慢(如果没关反向查询)
网络故障诊断一般是这样的顺序
1. 网络是否中断 (ping)
2. 是否丢包 (ping, ping -f, mtr)
3.1 路由是否正确 (route -n, ip route 等)
3.2 网线状态 (ethtool)
3.3 tcpdump 或者 ifconfig 看看收发包的情况,比如异常流量(大量 icmp,arp,udp)
3.4 arp 表
3.5 iptables 规则
3.6 dns
在一些软件配置上(如 lvs),要仔细检查路由和 arp。
Unix 系统管理员的 n 种武器 (3)再来看看文件、文件系统相关的命令
文件系统的挂载 - mount, umount
文件系统检查 - fsck
检查文件状态 - stat, ls
检查打开的文件 - fuser, lsof
空间检查 - df, du
查找文件 - find, locate, grep
文件权限 - chown, chmod, (linux) lsattr, chattr, getacl, setacl
特殊文件 - mknod, mkfifo, mkdir, rmdir
常用的压缩、归档工具 - tar, cpio, gzip, bzip2, 7zip, unzip, unrar
Linux 下万金油 - cat, ls (with /proc)
下面是一些小 tip
1. mount 的 noatime 选项需要特别留意。在打开文件时,系统默认会更新文件的 access time 时戳,如果对文件的访问模式是快速打开、关闭大量不同的文件,例如某些搜索应用、news 服务器等,即便应用是只读的,对 access time 的更新会引起可观的磁盘写入操作。noatime 关闭对 access time 的更新;
2. mount -o remount 在不卸载文件系统的情况下重新设置挂载选项,比如 mount -o remount,noatime /some_mnt_point。在 nfs 服务器宕机,进程僵死的情况下,可以用 remount 来修改 nfs 挂载选项 (mount -o remount,intr),使得进程可以被杀死
3. 对挂载上的文件系统进行写模式的 fsck 会造成文件系统损坏
4. du 一个目录,但不希望包括其子目录上的挂载的文件系统时,可以用 -x 来避免跨文件系统。find 是 -xdev;gnu tar 是 --one-file-system
5. 有时候,在文件被打开的情况下删除文件,会造成"隐藏"的空间占用,df 可以看见空间没了,可是 du 检查的结果是空间还有很多富余,这个时候,可以用 lsof /path 来检查,例如
# lsof /tmp
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
apache2 7184 www-data 15u REG 8,8 0 17 /tmp/.xcache.0.0.169170445.lock (deleted)
apache2 15216 www-data 15u REG 8,8 0 17 /tmp/.xcache.0.0.169170445.lock (deleted)
apache2 15313 www-data 15u REG 8,8 0 17 /tmp/.xcache.0.0.169170445.lock (deleted)
apache2 16041 www-data 15u REG 8,8 0 17 /tmp/.xcache.0.0.169170445.lock (deleted)
apache2 22031 root 15u REG 8,8 0 17 /tmp/.xcache.0.0.169170445.lock (deleted)
apache2 22778 www-data 15u REG 8,8 0 17 /tmp/.xcache.0.0.169170445.lock (deleted)
apache2 22781 www-data 15u REG 8,8 0 17 /tmp/.xcache.0.0.169170445.lock (deleted)
mysqld 29107 mysql 5u REG 8,8 0 12 /tmp/ibuA28pF (deleted)
mysqld 29107 mysql 6u REG 8,8 0 13 /tmp/ibpTXuPw (deleted)
mysqld 29107 mysql 7u REG 8,8 0 14 /tmp/ibQLeReo (deleted)
mysqld 29107 mysql 8u REG 8,8 0 15 /tmp/ibNTdyEf (deleted)
mysqld 29107 mysql 12u REG 8,8 0 16 /tmp/ib6kde56 (deleted)
apache2 32516 www-data 15u REG 8,8 0 17 /tmp/.xcache.0.0.169170445.lock (deleted)
apache2 32517 www-data 15u REG 8,8 0 17 /tmp/.xcache.0.0.169170445.lock (deleted)
apache2 32558 www-data 15u REG 8,8 0 17 /tmp/.xcache.0.0.169170445.lock (deleted)
apache2 32560 www-data 15u REG 8,8 0 17 /tmp/.xcache.0.0.169170445.lock (deleted)
6.空间有富余,权限也正确但无法写入,可能是文件系统的 inode 用完了,用 df -i 检查。和 inode 有关的参数,ls 是 -i,find 是 -inum
7. Linux 下,当你没有 lsof 可以用的时候,学会用 ls -l /proc/<pid>/fd/。上面的 lsof 例子可以写成
# ls -l /proc/*/fd |grep /tmp
8. find 不仅仅能按文件名搜索,它还可以按类型-type、时戳 -atime/-ctime/-mtime、比较时戳 -newer、权限 -perm、大小 -size、所有者 -uid/-user 等条件来找文件
9. locate 很好用,但它依赖于 updatedb 生成的数据库,有些情况下,需要限制 updatedb 索引的文件系统范围。这时,要了解 locate 的局限性
10. 要理解,权限不止 wrx 这三个属性
11. bzip2 压缩率比 gzip 好,但对于上 G 的文件,速度过分慢