DANH MỤC TÀI LIỆU
Xử lý sự cố máy chủ Linux
Kh c ph c s c máy ch Linux ự ố
B n đã bao gi g p ph i tình hu ng nghĩ r ng h th ng c a mình ho t ờ ặ
đ ng t t nh ng sau đó l i có r t nhi u ng i dùng báo cáo tình tr ng ch mộ ố ư ườ
ch p ho c các file b n ghi c a b n tr ng r ng, công vi c không ch y – ủ ạ
v y có cách nào có th tìm ra nh ng gì đang x y ra? ể ữ
Trong bài này chúng tôi s gi i thi u cho các b n m t s k thu t trong ố ỹ
vi c kh c ph c s c máy ch Linux. ự ố
Các công c h th ng c hàng đ u và c b nụ ệ ơ ơ ả
T t c các k thu t đ c th o lu n đây đ u yêu c u process ID. N u ượ ậ ở ế
b n bi t tên quá trình (process) g p s c ho c ch y không đúng, b n có ế ự ố
th l y đ c PID c a nó qua câu l nhể ấ ượ ps aux | grep processname. Cách
khác, b n có th tìm các quá trình CPU b ng l nh top:
Tasks: 114 total, 1 running, 113 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.2%us, 0.6%sy, 0.6%ni, 96.0%id, 1.6%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4053756k total, 1059196k used, 2994560k free, 305236k buffers
Swap: 2249060k total, 0k used, 2249060k free, 465112k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3055 akkana 20 0 160m 39m 18m S 39 1.0 0:02.83 plugin-containe
2223 akkana 20 0 330m 107m 26m S 16 2.7 0:51.33 firefox-bin
65 root 20 0 0 0 0 S 2 0.0 0:00.34 kondemand/0
1586 root 20 0 71712 22m 8244 S 2 0.6 0:24.87 Xorg
1 root 20 0 2748 1612 1216 S 0 0.0 0:00.37 init
2 root 20 0 0 0 0 S 0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/0
...
M c đ nh, l nh top b t đ u v i các process ng n nhi u tài nguyên CPU ắ ầ
nh t. Trong tr ng h p này, Firefox không g p s c , tuy nhiên nó đang ườ ự ố
ch y flash vì v y trình duy t và ng d ng tr giúp c a nó cùng nhau ng n ệ ứ
đ n 45% tài nguyên CPU. Đó chính là nguyên nhân, nh ng n u h th ng tế ư ế ệ ố
ra ch m ch p và b n th y m t process nào đó đang s d ng kho ng c ử ụ
99% tài nguyên CPU thì đây m i chính là th ph m. ủ ạ
Khi đã tìm ra đ c process, b n c n ph i bi t nh ng gì c n th c hi n ượ ạ ầ ế
ti p?ế
Strace
strace là m t ch ng trình h u d ng, ch ng trình này s hi n th các cu c ươ ươ ẽ ể
g i h th ng khi chúng xu t hi n.ọ ệ ố
Các cu c g i h th ng g m có các ho t đ ng v file gi ng nh đ c, ghi, ư ọ
m , timeout, tín hi u, các ho t đ ng m ng và m t s cách khác đ nh n và ộ ố
thi t l p thông tin h th ng. B n có th đ c t ng quan các n i dung b ng ế ể ọ
l nh man 2 intro hay li t kê danh sách các cu c g i có s n man 2 syscalls.
T t c các k thu t này nghe có v khá đ c đáo, tuy nhiên đôi khi vi c xemấ ả
xét d u hi u đ u ra cũng cho b n bi t đ c lý do t i sao m t ch ng trình ế ượ ươ
nào đó g p v n đ , ch ng h n nh nó đang đ i đ k t n i vào m ng nào ư ợ ể ế ố
đó, ho c l p đi l p l i quá trình m m t file mà file đó không t n t i.ặ ặ
B n có th ch y ch ng trình qua l nh ươ strace, ví d nhụ ư strace firefox. Tuy
nhiên ch c ch n b n s mu n t n công tr c ti p vào m t quá trình đang ố ấ ế
ch y. Hãy l y process ID qua câu l nh ps ho c top, sau đó s d ng ử ụ strace
-p.
Gi đ nh có m t process d ng nh b treo: l nh top s thông báo cho b n ả ị ườ ư ị
bi t r ng process này không s d ng b t c tài nguyên CPU nào, tuy nhiên ế ử ụ
nó b m c k t và không th c hi n b t c th gì trong n a gi đ ng h . ờ ồ
$ strace -p 3672
Process 3672 attached - interrupt to quit
recv(3,
… l nh strace d ng đây, con tr gi a dòng. V y đi u gì x y ra? ỏ ở
Ch ng trình đang đ i g i t h th ng recv. Nh n Ctrl-C đ thoát ươ ừ ệ
l nh strace, sau đó s d ngử ụ apropos:
$ apropos recv
recv (2) - receive a message from a socket
recvfrom (2) - receive a message from a socket
recvmsg (2) - receive a message from a socket
V y là quá trình đang đ i đ đ c th gì đó t socket m ng. ể ọ
Đ i và cách test?
Khi xây d ng m t th vi n các công c chu n đoán, b n có th mu n ư ệ
mình có đ c m t cách d dàng đ th nghi m chúng. Cách làm đây là ượ ể ử
b n hãy vi t m t ch ng trình l i đ th y rõ đ c cách g r i nó nh th ế ươ ỗ ể ấ ượ ư ế
nào.
M t ch ng trình l i đây có th mô ph ng hi n t ng m t m ng đang ươ ỗ ở ượ
treo n u b n có web server. Bên phía trình ch , vi t m t đo n mã nh sau:ế ạ ế ư
#! /usr/bin/env python
import time
print """Content-Type: text/html
Hello, world. Now we'll hang for a bit ...
"""
for i in range(50) : # Don't run forever and clog up the server
time.sleep(300) # sleep for 5 minutes
print "<p>\nAnother line"
B n có th test đo n mã trên b ng l nh wget ho c curl, ho c bi t m t k ch ế ộ ị
b n Python:
#!/usr/bin/env python
import urllib2
response = urllib2.urlopen("http://example.com/testcgi/index.cgi")
Rõ ràng, n u b n ch mu n có m t ch ng trình ng n h t các tài nguyên ế ạ ươ ố ế
CPU có s n, ch c n đánh m t th gì đó gi ng nh d i đây vào bash shell, ỉ ầ ư ướ
ho c t ng đ ng trong b t c ngôn ng l p trình nào. ươ ươ ữ ậ
while /bin/true; do
echo x
done
OK, b n đã s d ng stop ho c ps đ l y process ID,ạ ử ặ ể strace v n ch a cho ẫ ư
bi t b t c th gì h u d ng. V y th ti p theo là gì?ế ứ ế
B c ti p theo là l y stack trace b ng gdb. Stack trace không ch cho b n ướ ế
bi t ch ng trình gì đang th c s làm vi c lúc này m c th p (đang đ i ế ươ ở ứ
trên socket m ng), mà đôi khi còn cho b n bi t các thông tin m c cao h n ạ ế ơ
(ch ng h n nh ki u m ng đ c nó đã làm gì).ẳ ạ ư ạ ọ
Bi t đ c cách s d ng gdb đ l y stack trace cũng r t h u d ng n u b nế ượ ể ấ ế
c n m t file g r i cho m t ch ng trình nào đó đ v ho c b treo. ỡ ố ươ
Cũng gi ng nh strace, gdb s d ng ư ử ụ -p và process ID. Khi th c hi n, b n ự ệ
s nh n đ c nh c l nh(gdb). Đánh where đ l y ư stack trace.
Đây là m t stack trace t Firefox khi nó b n đang s d ng m t s k ch b n ử ụ ố ị
Javascript:
#0 0x01ad9794 in gfxPangoFontGroup::GetFontAt (this=0xa74e8160, i=0)
at gfxPangoFonts.cpp:1936
#1 0x01ad1c11 in GetFontOrGroup (this=0xa51466b4, aKey=0xbfab1e2c)
at gfxTextRunWordCache.cpp:899
#2 TextRunWordCache::CacheHashEntry::KeyEquals (this=0xa51466b4,
aKey=0xbfab1e2c) at gfxTextRunWordCache.cpp:910
#3 0x01a5cb74 in SearchTable (table=0xb45ce2d0, key=,
keyHash=, op=PL_DHASH_ADD) at pldhash.c:472
#4 0x01a5cc50 in PL_DHashTableOperate (table=0xb45ce2d0,
key=0xbfab1e2c,
op=) at pldhash.c:661
#5 0x01ad2421 in nsTHashtable::PutEntry (
this=0xb45ce2c0, aTextRun=0xa7ee0ae0, aFirstFont=0xad613d30, aStart=8,
aEnd=10, aHash=821, aDeferredWords=0x0)
at ../../../dist/include/nsTHashtable.h:188
#6 TextRunWordCache::LookupWord (this=0xb45ce2c0,
aTextRun=0xa7ee0ae0,
aFirstFont=0xad613d30, aStart=8, aEnd=10, aHash=821,
aDeferredWords=0x0)
at gfxTextRunWordCache.cpp:358
....
B n không c n ph i bi t nhi u v mã ngu n c a Firefox đ có th th y ế ể ấ
đ c nó đang làm gì v i các phông ch .ượ ớ ữ
N u m t ch ng trình đang th c hi n l p, nó có th không th c hi n th ế ươ ệ ặ
cùng m t th t t c th i gian. Khi ch y gdb -p, ch ng trình s đ c ươ ẽ ượ
ng ng đ b n có th ki m tra nó. Tuy nhiên b n có th ti p t c tr l i ể ể ế ụ
b ng cách đánh c t i nh c l nh. ắ ệ Ctrl-C l i stop ch ng trình l n n a, sau ươ ầ ữ
đó l nh where s in các stack trace khác.
(gdb) where
#0 0xb686db07 in ?? () from /usr/lib/firefox-3.6.12/libmozjs.so
#1 0xb684bec9 in ?? () from /usr/lib/firefox-3.6.12/libmozjs.so
#2 0xb685cf66 in js_Invoke () from /usr/lib/firefox-3.6.12/libmozjs.so
#3 0xb6b6231b in ?? () from /usr/lib/firefox-3.6.12/libxul.so
Đây ch là m t th g i ý Firefox đang th c hi n các công vi c liên quan ứ ợ
đ n Javascript (JS) và XUL. Stop và start quá trình m t vài l n, b n s c mế ẽ ả
nh n đ c v ch nó tiêu t n nhi u th i gian nh t. B n cũng có th nh n ượ ề ỗ
đ c các thông tin h u d ng đ có th s d ng trong vi c g r i cũng nhượ ỡ ố ư
tìm ki m trên web đ đ a ra cách gi i quy t.ế ể ư ế
Các Stack trace cũng có th r t h u d ng cho các ch ng trình treo trong ể ấ ươ
khi đ i tài nguyên. Đây là m t ng d ng m ng Python mà chúng tôi đã s ộ ứ
d ng tr c đó:ụ ướ
(gdb) where
#0 0x006a2422 in __kernel_vsyscall ()
#1 0x0095d241 in recv () at ../sysdeps/unix/sysv/linux/i386/socket.S:61
#2 0x081301ba in ?? ()
#3 0x081303b4 in ?? ()
#4 0x080e0a21 in PyEval_EvalFrameEx ()
#5 0x080e2807 in PyEval_EvalCodeEx ()
#6 0x080e0c8b in PyEval_EvalFrameEx ()
... etc.
Gdb hi n th nh nh ng gì ị ư ữ strace đã th c hi n: nó n m trongự ệ recv. Ph n
còn l i ch cho bi t r ng b n đang ch y bên trong ế ằ Python nh ng không chư ỉ
ra n i b n đang đâu trong k ch b nơ Python. V y có cách nào đ có th ể ể
tìm ra các thông tin khác đây?
Hãy đ i ph n ti p theo, trong ph n ti p theo t i chúng tôi s gi i gi i ầ ế ầ ế ớ ớ
thi u cho các b n v các k thu t g r i Python, và nh ng gì c n th c ầ ự
hi n n u không có các công c phát tri n gi ng nh gdb cài đ t trên máy ệ ế ư
g p v n đ .ặ ấ ề
thông tin tài liệu
Bạn đã bao giờ gặp phải tình huống nghĩ rằng hệ thống của mình hoạt động tốt nhưng sau đó lại có rất nhiều người dùng báo cáo tình trạng chậm chạp hoặc các file bản ghi của bạn trống rỗng, công việc không chạy – vậy có cách nào có thể tìm ra những gì đang xảy ra? Trong bài này chúng tôi sẽ giới thiệu cho các bạn một số kỹ thuật trong việc khắc phục sự cố máy chủ Linux.
Mở rộng để xem thêm
từ khóa liên quan
xem nhiều trong tuần
yêu cầu tài liệu
Giúp bạn tìm tài liệu chưa có

LÝ THUYẾT TOÁN


×