系统调试篇
对于web调试来说,curl和curl -l会有用,以及和wget相同的那部分功能。
如果想了解磁盘/cpu/网络的状态,可以使用iostat,netstat,top(更好一些的话,用htop),以及(尤其是)dstat,对于想快速了解系统当前正在发生的事情,非常的方便。如果想了解内存当前的状态,可以使用free以及vmstat,还要了解各项输出的含义。特别值得一提的是,你要知道“cached”的数值是linux内核保留用来做文件缓存的空间的大小,所以真正可用的有效内存是“free”项的对应值。
java的系统调试则完全是另外一回事,但在Sun以及其他的JVM上有一个简单的技巧,就是你可以运行kill -3 <pid> ,得到一个完整的栈调用轨迹以及堆使用的总体情况(包括产生的垃圾回收细节,这里面包含有很多的信息),会被定向到标准错误或者日志。
使用mtr作为更好的网络追踪,识别网络存在的问题。
要查看一个磁盘是否是满的,ncdu要比一般用的“du -sk *”要快。
要查看哪些socket或者进程在占用带宽,试试iftop或者netlogs。
ab 工具(随apache的安装包一起发布)对于检测网络服务器的性能很有帮助,对于更加复杂的压力测试,可以试下siege。对于更加严重的网络问题的调试,试试wireshark或者tshark。了解strace和ltrace。这在一个程序突然失败,挂掉,或者崩溃,而你却不知所措,或者是你想知道程序的整体性能的情况时,会很有帮助。可以注意下-c和-p选项。
了解用ldd来检查共享库函数等的一些问题。
了解如何用gdb连接到一个正在运行的程序,并且得到它的调用堆栈。
使用/proc. 对于现场调试问题会很有帮忙。例如:/proc/cpuinfo, /proc/xxx/cwd, /proc/xxx/exe, /proc/xxx/fd/, /proc/xxx/smaps。
当要调试过去一段时间内出现的问题时,sar 会有用,它可以显示过去一段时间内的CPU,内存,网络的统计信息。
对于更深层次的系统性能优化,可以关注下stap(systemtap)或者perf。
当出现了一些很诡异的问题时,可以试下dmesg(比如硬件或者驱动的问题)。