作为一个
系统管理员,你认为一切都在你的
控制和控制下吗但现实往往是事与愿违,你认为那些是
运行和数据收集过程有两个小时没有
报告任何
消息给你,也许你失去了客户响应,
服务器可能有问题,你可以不知道哪里是问题的第一时间,和大多数的问题是每个几天会反复,再好的人的心态,遇到这种
情况会暴跳如雷。因此,如何找出运行过程中发生了什么事实上,我们不需要先进的知识或先进的监控套件。我们有足够的
工具来使用这个系统。下面
介绍一下如何使用Linux工具诊断服务器
故障。
图形卡故障
顶部和其他系统工具
内存故障
如果你想知道发生了什么的过程中,在
操作过程中,我们最好把
进程的ID,如果你知道
名字卡住或资源消耗上升的过程,反
检查的过程中的身份是很容易的,ps aux grep的| ProcessName
命令的使用,不知道该进程的名称也没关系,我们还可以使用顶部查看内存利用率高或高CPU的共享过程。
任务:总共114个,1个跑步,113个睡觉,0个停止,0个僵尸。
CPU:1.2%个美国,0.6%个SY,0.6%个NI,96%个id,1.6%个佤族,0%个HI,0%个SI,0%个st
Mem:4053756k总,1059196k使用,2994560k自由,305236k缓冲器
互换:2249060k总,0k使用,2249060k自由,465112k缓存
PID
用户Pr-Ni VIRT RES SHR的CPU时间为MEM +命令
3055 akkana 200 160m 39m 18M 391 0: 2.83
插件容器
2223 akkana 200 330m 107m 26m 162.7 0:火狐51.33仓
65根200000 20 0: 0.34 kondemand / 0
1586根20071712 8244 20.6 24.87 22m 0: xorg
1根200274816121216 0 0: 0.37初始化
2根200000 0 0 kthreadd 0:
3根RT 0000 0 0: 0迁移 / 0
…凡此种种,不一而足。
默认情况下,top命令会根据CPU的反向
顺序吃掉多少,在上面的例子中,Firefox卡住了,它运行Flash
浏览器,它连同辅助
程序占用CPU时钟周期45%,这不是什么,如果你看到CPU利用率达到99%,它必须有一个过程。
当你
发现一个过程的问题时,你怎么知道它在做什么在这个时候,Strace。
strace
Strace是一个非常有用的程序,它可以
显示系统调用系统调用发生,包括
文件操作,如读、写和开放,超时和发送
信号,
网络运营和其他信息系统获取或
设置操作,你可以阅读的人2查看
详细介绍概述2系统调用列表查看所有可用的系统调用或人。
这一切听起来有点神秘,但有时strace输出能够准确地理解为什么一个程序出了故障,也许在
等待网络,也许重复文件,根本不存在。
你可以在strace运行一个程序,如strace Firefox,但更多的时候,你要
连接到正在运行的进程。当然,没问题。首先使用PS或顶部获取进程ID,然后使用strace P的进程ID。
假设我有一个程序好像挂了。top命令显示它不使用任何CPU,但是它已经被卡住至少半个小时了,我们什么也没做。我们使用strace P来跟踪它。
strace -p 3672美元
进程3672附加-中断
退出 Recv(3,
Strace站在队伍中的光标
闪烁。怎么了
事实上,它在等待recv系统调用,退出strace按Ctrl-C,然后用中肯。
关于美元:
Recv(2)-收到一个socket消息
recvfrom(2)收到一个socket消息
Recvmsg(2)-收到一个socket消息
从上面的结果可以看到,进程正在等待读取网络套接字的内容,很明显,我们对这个过程有了进一步的了解。
如何
模拟故障
当您构建诊断工具库时,有时您可能希望有一种简单的
方法来体验它们。在这一点上,我们需要模仿的过程挂断了。如果你有一个Web服务器,你就可以很好地编写一个
脚本。
#! / usr /斌/环境Python
进口时间
打印内容
类型:
文本 html
你好,世界。现在我们要等一会儿…
我在系列(50):不要跑下去,堵塞#服务器
(300)time.sleep睡5分钟#
打印另一行
你可以使用wget,卷曲,或写一个Python脚本来测试。
#! / usr /斌/环境Python
进口urllib2
响应= urllib2.urlopen()
当然,如果希望程序占用所有可用的CPU资源,只需在脚本中添加以下代码即可:
当真的
回声X
多恩
只要它实现了,它就可以用在其他
语言中。
如果上面的帮助信息仍不够大,有一个最后的法宝—
使用GDB获取堆栈跟踪信息
好吧,我承认,即使进程ID和strace输出,但是仍然没有帮助,别担心,我也使出绝招,诀窍是使用GDB来获取堆栈跟踪信息,堆栈跟踪不仅会告诉你什么程序正在做的,有潜在的信息(如等待,也有了更高的网络套接字)信息化水平(如
执行什么类型的网络操作)。
strace的用法一样,GDB也采用P+ID命令格式。
启动后,您将获得一个GDB
提示符并
输入堆栈跟踪的
位置。
# 0 0x01ad9794在gfxpangofontgroup::GetFontAt(= 0xa74e8160,I = 0)
在gfxpangofonts CPP:1936。
# 1 0x01ad1c11在getfontorgroup(= = 0xa51466b4,关键0xbfab1e2c)
在gfxtextrunwordcache CPP:899。
# 2 textrunwordcache::::KeyEquals(这cachehashentry = 0xa51466b4,
关键= 0xbfab1e2c)在gfxtextrunwordcache CPP:910。
3在# 0x01a5cb74查寻表(表= 0xb45ce2d0,关键=,
keyhash =,= pl_dhash_add OP)在pldhash。C:472
# 4 0x01a5cc50在pl_dhashtableoperate(表= = 0xbfab1e2c 0xb45ce2d0,关键,
OP =)在pldhash。C:661
# 5 0x01ad2421在nsthashtable::PutEntry(
本0xb45ce2c0,atextrun = 0xa7ee0ae0,afirstfont = 0xad613d30,ASTART = 8,
端= 10,ahash = 821,adeferredwords = 0x0)
在.. / / / .. ..距离 /包括/ nsthashtable。H:188
# 6 textrunwordcache::LookupWord(= = 0xa7ee0ae0 0xb45ce2c0,atextrun,
afirstfont = 0xad613d30,ASTART = 8,= 10把,ahash = 821,adeferredwords = 0x0)
在gfxtextrunwordcache CPP:358。
等....
即使您不熟悉Firefox的源代码,也可以从上面的堆栈跟踪结果中看到它
处理与
字体相关的东西。
如果程序循环,那么它会一直做同样的事情,当你运行GDB P,它会暂时停止让你检查提示按C程序可以让它继续,按Ctrl-C将再次停止,然后进入一个会获得第二堆栈的输出。
(GDB)在哪里
0在()# 0xb686db07从 / usr / / / libmozjs.so firefox-3.6.12 lib
1在()# 0xb684bec9从 / usr / / / libmozjs.so firefox-3.6.12 lib
# 2 0xb685cf66在js_invoke()从 / usr / / / libmozjs.so firefox-3.6.12 lib
3在()# 0xb6b6231b从 / usr / / / libxul.so firefox-3.6.12 lib
这一次的结果是不一样的,它只是一种淡淡的Firefox的Javascript(JS)和XUL相关事宜,反复停止和启动程序,你会发现它在大多数时间,有用的信息可以附加到您提交的bug,或使用一些他们在
搜索引擎的关键词搜索,看是否有现成的
解决方案。
堆栈跟踪被应用到等待资源挂起的程序中,下面是我以前使用的Python程序跟踪的结果。
(GDB)在哪里
# 0 0x006a2422在__kernel_vsyscall()
# recv()在1 0x0095d241 .. / / / sysdeps Unix / Linux i386 SysV / /插座:61。
# 2 0x081301ba在()
# 3 0x081303b4在()
# 4 0x080e0a21在pyeval_evalframeex()
# 5 0x080e2807在pyeval_evalcodeex()
# 6 0x080e0c8b在pyeval_evalframeex()
等....
gdb显示一些信息:收到,接下来的内容告诉你,你正在运行的Python,但它不会告诉你你在Python脚本的地方,你想知道如何挖掘出更多的信息吗请继续关注下一篇文章,我将介绍一些python程序的技术
模式,开发工具如GDB没有
安装在一台花哨的机器上做什么。