Github: the-art-of-command-line
原文部分:
## 系统调试
curl
和 curl -I
可以被轻松地应用于 web 调试中,它们的好兄弟 wget
也是如此,或者也可以试试更潮的 httpie
。
获取 CPU 和硬盘的使用状态,通常使用使用 top
(htop
更佳),iostat
和 iotop
。而 iostat -mxz 15
可以让你获悉 CPU 和每个硬盘分区的基本信息和性能表现。
使用 netstat
和 ss
查看网络连接的细节。
dstat
在你想要对系统的现状有一个粗略的认识时是非常有用的。然而若要对系统有一个深度的总体认识,使用 glances
,它会在一个终端窗口中向你提供一些系统级的数据。
若要了解内存状态,运行并理解 free
和 vmstat
的输出。值得留意的是“cached”的值,它指的是 Linux 内核用来作为文件缓存的内存大小,而与空闲内存无关。
Java 系统调试则是一件截然不同的事,一个可以用于 Oracle 的 JVM 或其他 JVM 上的调试的技巧是你可以运行 kill -3 <pid>
同时一个完整的栈轨迹和堆概述(包括 GC 的细节)会被保存到标准错误或是日志文件。JDK 中的 jps
,jstat
,jstack
,jmap
很有用。SJK tools 更高级。
使用 mtr
去跟踪路由,用于确定网络问题。
用 ncdu
来查看磁盘使用情况,它比寻常的命令,如 du -sh *
,更节省时间。
ab
工具(Apache 中自带)可以简单粗暴地检查 web 服务器的性能。对于更复杂的负载测试,使用 siege
。
了解 strace
和 ltrace
。这俩工具在你的程序运行失败、挂起甚至崩溃,而你却不知道为什么或你想对性能有个总体的认识的时候是非常有用的。注意 profile 参数(-c
)和附加到一个运行的进程参数 (-p
)。
了解使用 ldd
来检查共享库。但是永远不要在不信任的文件上运行。
了解如何运用 gdb
连接到一个运行着的进程并获取它的堆栈轨迹。
学会使用 /proc
。它在调试正在出现的问题的时候有时会效果惊人。比如:/proc/cpuinfo
,/proc/meminfo
,/proc/cmdline
,/proc/xxx/cwd
,/proc/xxx/exe
,/proc/xxx/fd/
,/proc/xxx/smaps
(这里的 xxx
表示进程的 id 或 pid)。
当调试一些之前出现的问题的时候,sar
非常有用。它展示了 cpu、内存以及网络等的历史数据。
查看你当前使用的系统,使用 uname
,uname -a
(Unix/kernel 信息)或者 lsb_release -a
(Linux 发行版信息)。
无论什么东西工作得很欢乐(可能是硬件或驱动问题)时可以试试 dmesg
。
如果你删除了一个文件,但通过 du
发现没有释放预期的磁盘空间,请检查文件是否被进程占用:
lsof | grep deleted | grep "filename-of-my-big-file"