前言
祁東ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
I/O Wait是一個需要使用高級的工具來debug問題原因,當然也有許多基本工具的高級用法。I/O wait的問題難以定位的原因是:因為我們有很多工具可以告訴你I/O 受限了,但是并沒有告訴你具體是哪個進程引起的。
1. 如何確認,是否是I/O問題導致系統緩慢
確認是否是I/O導致的系統緩慢我們可以使用多個命令,但是,最簡單的是unix的命令 top
# top
top - 14:31:20 up 35 min, 4 users, load average: 2.25, 1.74, 1.68
Tasks: 71 total, 1 running, 70 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.3%us, 1.7%sy, 0.0%ni, 0.0%id, 96.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 245440k total, 241004k used, 4436k free, 496k buffers
Swap: 409596k total, 5436k used, 404160k free, 182812k cached
從CPU這行,可以發現CPU的io wait;這里是96.0%。越高就代表CPU用于io wait的資源越多。
2. 找出哪個磁盤正在被寫入
上邊的top命令從一個整體上說明了I/O wait,但是并沒有說明是哪塊磁盤影響的,想知道是哪塊磁盤引發的問題,可以使用另外一個命令 iostat 命令
$ iostat -x 2 5
avg-cpu: %user %nice %system %iowait %steal %idle
3.66 0.00 47.64 48.69 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 44.50 39.27 117.28 29.32 11220.94 13126.70 332.17 65.77 462.79 9.80 2274.71 7.60 111.41
dm-0 0.00 0.00 83.25 9.95 10515.18 4295.29 317.84 57.01 648.54 16.73 5935.79 11.48 107.02
dm-1 0.00 0.00 57.07 40.84 228.27 163.35 8.00 93.84 979.61 13.94 2329.08 10.93 107.02
iostat 會每2秒更新一次,一共打印5次信息, -x 的選項是打印出擴展信息
第一個iostat 報告會打印出系統最后一次啟動后的統計信息,這也就是說,在多數情況下,第一個打印出來的信息應該被忽略,剩下的報告,都是基于上一次間隔的時間。舉例子來說,這個命令會打印5次,第二次的報告是從第一次報告出來一個后的統計信息,第三次是基于第二次 ,依次類推
所以,一定記?。旱谝粋€忽略!
在上面的例子中,sda的%utilized 是111.41%,這個很好的說明了有進程正在寫入到sda磁盤中。
除了%utilized 外,我們可以從iostat得到更加豐富的資源信息,例如每毫秒讀寫請求(rrqm/s wrqm/s)),每秒讀寫的((r/s w/s)。在上邊的例子中,我們的項目看起來正在讀寫非常多的信息。這個對我們查找相應的進程非常有用。
3. 找出導致高IO的進程
# iotop
Total DISK READ: 8.00 M/s | Total DISK WRITE: 20.36 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
15758 be/4 root 7.99 M/s 8.01 M/s 0.00 % 61.97 % bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
最簡單的方法就是用iotop找出哪個進程用了最多的存儲資源,從上面可以看到是bonnie++。
iotop很好用,但是不是默認安裝的。
如果沒有iotop,下面的方式也可以讓你有種方法縮小范圍,盡快找到是哪個進程。
ps 命令對內存和CPU有一個統計,但是他沒有對磁盤I/O的統計,雖然他沒有顯示磁盤I/O,但是它顯示進行的狀態,我們可以用來知道一個進程是否正在等待I/O
主要的進程狀態有:
PROCESS STATE CODES
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent.
等待I/O的進程的狀態一般是“uninterruptible sleep”,或者“D”,我們可以很容易的查找到正在等待I/O的進程
# for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done
D 248 [jbd2/dm-0-8]
D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
----
D 22 [kswapd0]
D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
----
D 22 [kswapd0]
D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
----
D 22 [kswapd0]
D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
----
D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
上邊的例子會循環的輸出狀態是D的進程,每5秒一次,一共10次
從輸出我們可以知道 bonnie++ 的pid是16528 ,在waiting,bonnie++看起來就是我們想找到的進程,但是,只是從它的狀態,我們沒有辦法證明就是bonnie++引起的I/O等待。
為了證明,我們可以可以查看/proc,每個進程目錄下都有一個叫io的文件,里邊保存這和iotop類似的信息。
# cat /proc/16528/io
rchar: 48752567
wchar: 549961789
syscr: 5967
syscw: 67138
read_bytes: 49020928
write_bytes: 549961728
cancelled_write_bytes: 0
read_bytes和write_bytes是這個進程從磁盤讀寫的字節,在這個例子中,bonnie++進程讀取了46M的數據并且寫入了524MB的數據到磁盤上。
4. 找出哪個文件正在被大量寫入
lsof 命令可以展示一個進程打開的所有文件。從這個列表中,我們可以找到哪個文件被寫入。
# lsof -p 16528
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bonnie++ 16528 root cwd DIR 252,0 4096 130597 /tmp
truncated
bonnie++ 16528 root 8u REG 252,0 501219328 131869 /tmp/Bonnie.16528
bonnie++ 16528 root 9u REG 252,0 501219328 131869 /tmp/Bonnie.16528
bonnie++ 16528 root 10u REG 252,0 501219328 131869 /tmp/Bonnie.16528
bonnie++ 16528 root 11u REG 252,0 501219328 131869 /tmp/Bonnie.16528
bonnie++ 16528 root 12u REG 252,0 501219328 131869 strong/tmp/Bonnie.16528/strong
# df /tmp
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/workstation-root 7667140 2628608 4653920 37% /
# pvdisplay
--- Physical volume ---
PV Name /dev/sda5
VG Name workstation
PV Size 7.76 GiB / not usable 2.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 1986
Free PE 8
Allocated PE 1978
PV UUID CLbABb-GcLB-l5z3-TCj3-IOK3-SQ2p-RDPW5S
使用pvdisplay可以看到,pv設備就是/dev/sda5,正是我們前面找到的sda。
參考文檔:
你想問得是php如何執行shell命令把?\x0d\x0a\x0d\x0a可以用system(),exec(),passthru()這三個函數實現\x0d\x0a雖然這三個命令都能執行linux系統的shell命令,但是其實他們是有區別的:\x0d\x0a system() 輸出并返回最后一行shell結果。\x0d\x0a exec() 不輸出結果,返回最后一行shell結果,所有結果可以保存到一個返回的數組里面。\x0d\x0a passthru() 只調用命令,把命令的運行結果原樣地直接輸出到標準輸出設備上。\x0d\x0a 相同點:都可以獲得命令執行的狀態碼\x0d\x0a例子:system("ls -al");\x0d\x0a【使用之前要在php.ini中把safe_mode關閉】
top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似于Windows的任務管理器。下面詳細介紹它的使用方法。
top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48
Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 191272k total, 173656k used, 17616k free, 22052k buffers
Swap: 192772k total, 0k used, 192772k free, 123988k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1379 root 16 0 7976 2456 1980 S 0.7 1.3 0:11.03 sshd
14704 root 16 0 2128 980 796 R 0.7 0.5 0:02.72 top
1 root 16 0 1992 632 544 S 0.0 0.3 0:00.90 init
2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
統計信息區前五行是系統整體的統計信息。第一行是任務隊列信息,同 uptime 命令的執行結果。其內容如下:
01:06:48 當前時間
up 1:22 系統運行時間,格式為時:分
1 user 當前登錄用戶數
load average: 0.06, 0.60, 0.48 系統負載,即任務隊列的平均長度。
三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。
第二、三行為進程和CPU的信息。當有多個CPU時,這些內容可能會超過兩行。內容如下:
Tasks: 29 total 進程總數
1 running 正在運行的進程數
28 sleeping 睡眠的進程數
0 stopped 停止的進程數
0 zombie 僵尸進程數
Cpu(s): 0.3% us 用戶空間占用CPU百分比
1.0% sy 內核空間占用CPU百分比
0.0% ni 用戶進程空間內改變過優先級的進程占用CPU百分比
98.7% id 空閑CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
0.0% hi
0.0% si
最后兩行為內存信息。內容如下:
Mem: 191272k total 物理內存總量
173656k used 使用的物理內存總量
17616k free 空閑內存總量
22052k buffers 用作內核緩存的內存量
Swap: 192772k total 交換區總量
0k used 使用的交換區總量
192772k free 空閑交換區總量
123988k cached 緩沖的交換區總量。
內存中的內容被換出到交換區,而后又被換入到內存,但使用過的交換區尚未被覆蓋,
該數值即為這些內容已存在于內存中的交換區的大小。
相應的內存再次被換出時可不必再對交換區寫入。
進程信息區統計信息區域的下方顯示了各個進程的詳細信息。首先來認識一下各列的含義。
序號 列名 含義
a PID 進程id
處理問題時必定不能盲狙,將所有解決辦法都試上一遍。這生產環境中,解決出現的問題是最優先的事情,當然前提是這問題會影響用戶的使用或即將影響到的。
處理每個問題必然可按具體問題進行分類,根據每一類按對應的解決思路來執行。
但像處理一個網絡問題的時候,上至系統防火墻的配置、下至硬件故障。如果處理一個問題都按固定流程來進行的話,那必然效率將非常低下。下為處理網絡故障的一般流程。
1、網絡硬件問題檢查。???????????????????? (機率較低)
2、檢查網卡能否正常工作。??????????? (較高、主要表現為人為配置錯誤)
3、檢查局域網之間聯機是否正常。(非常高)
4、檢查DNS是否設定正確。??????????? (較低)
5、服務是否正常打開。???????????????????? (低)
6、檢查訪問權限是否打開。??????????? (較高)
假如從1至6是標準的處理網絡問題的流程,這樣的處理方式效率低下。處理問題可以有整體的流程,但是實際操作中可先對出現機率更高的步驟進行檢查、或采取2分法縮小產生問題的范圍,雖然上述較的兩個方法不一定對所有問題都試用,但對于大多數的網絡問題來說處理效率有者顯著的提升。
個人總結的情況如下。
1、lsmod | grep ip??????????? 查看相關的網卡模塊是否已加載
2、ifconfig -a??????????????????? 能使用該命令查找到對應網卡配置信息,則說明網卡驅動程序正常
3、使用ping命令、依次ping自己、ping局域網主機、ping網關
ping自己異常,問題:服務異常、網卡配置未生效
ping局域網主機異常,問題:配置文件有誤、網卡配置未生效、網線損壞
ping網關異常,問題:配置文件有誤、網卡配置未生效
4、當前3步還不能正常上外網的話。所有route查看默認路由表。
處理方法:刪除不必要的路由信息,并保證默認路由是從對應網關地址出去的。
5、臨時停止iptables服務、SELinux服務、NetworkManager服務
6、如能上網但訪問域名有異常時,那將需要檢查/etc/hosts、/etc/resolv.conf兩個配置
7、假如以上6步檢查完畢之后,還發現不能上網。有如下可能。
7.1、主機MAC地址被路由器禁止上網
7.2、外網服務異常。如寬帶賬號欠費、光纖被挖斷等物理攻擊。
標題名稱:linux命令思路 linux命令用法
文章路徑:http://vcdvsql.cn/article4/ddojiie.html
成都網站建設公司_創新互聯,為您提供企業網站制作、微信小程序、軟件開發、手機網站建設、、網站收錄
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯