Ⅰ linux查看磁碟io的幾種方法
linux查看磁碟io的幾種方法
怎樣才能快速的定位到並發高是由於磁碟io開銷大呢?可以通過三種方式:
第一種:用 top 命令 中的cpu 信息觀察
Top可以看到的cpu信息有:
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
具體的解釋如下:
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
0.0% wa 的百分比可以大致的體現出當前的磁碟io請求是否頻繁。如果 wa的數量比較大,說明等待輸入輸出的的io比較多。
第二種:用vmstat
vmstat 命令報告關於線程、虛擬內存、磁碟、陷阱和 CPU 活動的統計信息。由 vmstat 命令生成的報告可以用於平衡系統負載活動。系統范圍內的這些統計信息(所有的處理器中)都計算出以百分比表示的平均值,或者計算其總和。
輸入命令:
vmstat 2 5
如果發現等待的進程和處在非中斷睡眠狀態的進程數非常多,並且發送到塊設備的塊數和從塊設備接收到的塊數非常大,那就說明磁碟io比較多。
vmstat參數解釋:
Procs
r: 等待運行的進程數 b: 處在非中斷睡眠狀態的進程數 w: 被交換出去的可運行的進程數。此數由 linux 計算得出,但 linux 並不耗盡交換空間
Memory
swpd: 虛擬內存使用情況,單位:KB
free: 空閑的內存,單位KB
buff: 被用來做為緩存的內存數,單位:KB
Swap
si: 從磁碟交換到內存的交換頁數量,單位:KB/秒
so: 從內存交換到磁碟的交換頁數量,單位:KB/秒
IO
bi: 發送到塊設備的塊數,單位:塊/秒
bo: 從塊設備接收到的塊數,單位:塊/秒
System
in: 每秒的中斷數,包括時鍾中斷
cs: 每秒的環境(上下文)切換次數
CPU
按 CPU 的總使用百分比來顯示
us: CPU 使用時間
sy: CPU 系統使用時間
id: 閑置時間
准測
更多vmstat使用信息
第二種:用iostat
安裝:
Iostat 是 sysstat 工具集的一個工具,需要安裝。
Centos的安裝方式是:
yum install sysstat
Ubuntu的安裝方式是:
aptitude install sysstat
使用:
iostat -dx 顯示磁碟擴展信息
root@fileapp:~# iostat -dx
r/s 和 w/s 分別是每秒的讀操作和寫操作,而rKB/s 和wKB/s 列以每秒千位元組為單位顯示了讀和寫的數據量
如果這兩對數據值都很高的話說明磁碟io操作是很頻繁。
+++++++++++++++++++++++++++++++++++++
linux wa%過高,iostat查看io狀況
1, 安裝 iostat
yum install sysstat
之後就可以使用 iostat 命令了,
2,入門使用
iostat -d -k 2
參數 -d 表示,顯示設備(磁碟)使用狀態;-k某些使用block為單位的列強制使用Kilobytes為單位;2表示,數據顯示每隔2秒刷新一次。
tps:該設備每秒的傳輸次數(Indicate the number of transfers per second that were issued to the device.)。"一次傳輸"意思是"一次I/O請求"。多個邏輯請求可能會被合並為"一次I/O請求"。"一次傳輸"請求的大小是未知的。kB_read/s:每秒從設備(drive expressed)讀取的數據量;
kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;
kB_read:讀取的總數據量;kB_wrtn:寫入的總數量數據量;這些單位都為Kilobytes。
指定監控的設備名稱為sda,該命令的輸出結果和上面命令完全相同。
iostat -d sda 2
默認監控所有的硬碟設備,現在指定只監控sda。
3, -x 參數
iostat還有一個比較常用的選項 -x ,該選項將用於顯示和io相關的擴展數據。
iostat -d -x -k 1 10
輸出信息的含義
。
4, 常見用法
iostat -d -k 1 10 #查看TPS和吞吐量信息(磁碟讀寫速度單位為KB)
iostat -d -m 2 #查看TPS和吞吐量信息(磁碟讀寫速度單位為MB)
iostat -d -x -k 1 10 #查看設備使用率(%util)、響應時間(await) iostat -c 1 10 #查看cpu狀態
5, 實例分析
iostat -d -k 1 | grep vda
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda10 60.72 18.95 71.53 395637647 1493241908
sda10 299.02 4266.67 129.41 4352 132
sda10 483.84 4589.90 4117.17 4544 4076
sda10 218.00 3360.00 100.00 3360 100
sda10 546.00 8784.00 124.00 8784 124
sda10 827.00 13232.00 136.00 13232 136
上面看到,磁碟每秒傳輸次數平均約400;每秒磁碟讀取約5MB,寫入約1MB。
iostat -d -x -k 1
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29
sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25
sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24
可以看到磁碟的平均響應時間<5ms,磁碟使用率>80。磁碟響應正常,但是已經很繁忙了。
可以看到磁碟的平均響應時間<5ms,磁碟使用率>90。磁碟響應正常,但是已經很繁忙了。
await: 每一個IO請求的處理的平均時間(單位是微秒毫秒)。這里可以理解為IO的響應時間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了
svctm 表示平均每次設備I/O操作的服務時間(以毫秒為單位)。如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁碟性能很好,
如果await的值遠高於svctm的值,則表示I/O隊列等待太長, 系統上運行的應用程序將變慢。
%util: 在統計時間內所有處理IO時間,除以總共統計時間
所以該參數暗示了設備的繁忙程度
。一般地,如果該參數是100%表示設備已經接近滿負荷運行了(當然如果是多磁碟,即使%util是100%,因為磁碟的並發能力,所以磁碟使用未必就到了瓶頸)。
也可以使用下面的命令,同時顯示cpu和磁碟的使用情況
等待時間超過5ms, 磁碟io有問題
Ⅱ 如何查看linux伺服器io讀寫情況
首先 、用top命令查看
top - 16:15:05 up 6 days, 6:25, 2 users, load average: 1.45, 1.77, 2.14
Tasks: 147 total, 1 running, 146 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2% us, 0.2% sy, 0.0% ni, 86.9% id, 12.6% wa, 0.0% hi, 0.0% si
Mem: 4037872k total, 4003648k used, 34224k free, 5512k buffers
Swap: 7164948k total, 629192k used, 6535756k free, 3511184k cached
查看12.6% wa
IO等待所佔用的CPU時間的百分比,高過30%時IO壓力高
其次、 用iostat -x 1 10
avg-cpu: %user %nice %sys %iowait %idle
0.00 0.00 0.25 33.46 66.29
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 1122 17.00 9.00 192.00 9216.00 96.00 4608.00 123.79 137.23 1033.43 13.17 100.10
sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
查看%util 100.10 %idle 66.29
如果 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁碟可能存在瓶頸。
idle小於70% IO壓力就較大了,一般讀取速度有較多的wait.
同時可以結合vmstat 查看查看b參數(等待資源的進程數)
vmstat -1
如果你想對硬碟做一個IO負荷的壓力測試可以用如下命令
time dd if=/dev/zero bs=1M count=2048 of=direct_2G
此命令為在當前目錄下新建一個2G的文件
我們在新建文件夾的同時來測試IO的負荷情況
Ⅲ 如何提高Linux伺服器磁碟io性能
您好,很高興為您解答。
在現有文件系統下進行優化:
linux內核和各個文件系統採用了幾個優化方案來提升磁碟訪問速度。但這些優化方案需要在我們的伺服器設計中進行配合才能得到充分發揮。
文件系統緩存
linux內核會將大部分空閑內存交給虛擬文件系統,來作為文件緩存,叫做page cache。在內存不足時,這部分內存會採用lru演算法進行淘汰。通過free命令查看內存,顯示為cached的部分就是文件緩存了。
如何針對性優化:
lru並不是一個優秀淘汰演算法,lru最大的優勢是普適性好,在各種使用場景下都能起到一定的效果。如果能找到當前使用場景下,文件被訪問的統計特徵,針 對性的寫一個淘汰演算法,可以大幅提升文件緩存的命中率。對於http正向代理來說,一個好的淘汰演算法可以用1GB內存達到lru演算法100GB內存的緩存 效果。如果不打算寫一個新的淘汰演算法,一般不需要在應用層再搭一個文件cache程序來做緩存。
最小分配:
當文件擴大,需要分配磁碟空間時,大部分文件系統不會僅僅只分配當前需要的磁碟空間,而是會多分配一些磁碟空間。這樣下次文件擴大時就可以使用已經分配好的空間,而不會頻繁的去分配新空間。
例如ext3下,每次分配磁碟空間時,最小是分配8KB。
最小分配的副作用是會浪費一些磁碟空間(分配了但是又沒有使用)
如何針對性優化:
我們在reiserfs下將最小分配空間從8KB改大到128K後提升了30%的磁碟io性能。如果當前使用場景下小文件很多,把預分配改大就會浪費很多 磁碟空間,所以這個數值要根據當前使用場景來設定。似乎要直接改源代碼才能生效,不太記得了,09年的時候改的,有興趣的同學自己google吧。
io訪問調度:
在同時有多個io訪問時,linux內核可以對這些io訪問按LBA進行合並和排序,這樣磁頭在移動時,可以「順便」讀出移動過程中的數據。
SATA等磁碟甚至在磁碟中內置了io排序來進一步提升性能,一般需要在主板中進行配置才能啟動磁碟內置io排序。linux的io排序是根據LBA進行的,但LBA是一個一維線性地址,無法完全反應出二維的圓形磁碟,所以磁碟的內置io排序能達到更好的效果。
如何針對性優化:
io訪問調度能大幅提升io性能,前提是應用層同時發起了足夠的io訪問供linux去調度。
怎樣才能從應用層同時向內核發起多個io訪問呢?
方案一是用aio_read非同步發起多個文件讀寫請求。
方案二是使用磁碟線程池同時發起多個文件讀寫請求。
對我們的http正向代理來說,採用16個線程讀寫磁碟可以將性能提升到2.5倍左右。具體開多少個線程/進程,可以根據具體使用場景來決定。
小提示:
將文件句柄設置為非阻塞時,進程還是會睡眠等待磁碟io,非阻塞對於文件讀寫是不生效的。在正常情況下,讀文件只會引入十幾毫秒睡眠,所以不太明顯;而在磁碟io極大時,讀文件會引起十秒以上的進程睡眠。
預讀取:
linux內核可以預測我們「將來的讀請求」並提前將數據讀取出來。通過預讀取可以減少讀io的次數,並且減小讀請求的延時。
如何針對性優化:
預讀取的預測准確率是有限的,與其依賴預讀取,不如我們直接開一個較大的緩沖區,一次性將文件讀出來再慢慢處理;盡量不要開一個較小的緩沖區,循環讀文件/處理文件。
雖然說「預讀取」和「延遲分配」能起到類似的作用,但是我們自己擴大讀寫緩沖區效果要更好。
延遲分配:
當文件擴大,需要分配磁碟空間時,可以不立即進行分配,而是暫存在內存中,將多次分配磁碟空間的請求聚合在一起後,再進行一次性分配。
延遲分配的目的也是減少分配次數,從而減少文件不連續。
延遲分配的副作用有幾個:
1、如果應用程序每次寫數據後都通過fsync等介面進行強制刷新,延遲分配將不起作用
2、延遲分配有可能間歇性引入一個較大的磁碟IO延時(因為要一次性向磁碟寫入較多數據)
只有少數新文件系統支持這個特性
如何針對性優化:
如果不是對安全性(是否允許丟失)要求極高的數據,可以直接在應用程序里緩存起來,積累到一定大小再寫入,效果比文件系統的延遲分配更好。如果對安全性要求極高,建議經常用fsync強制刷新。
在線磁碟碎片整理:
Ext4提供了一款碎片整理工具,叫e4defrag,主要包含三個功能:
1、讓每個文件連續存儲
2、盡量讓每個目錄下的文件連續存儲
3、通過整理空閑磁碟空間,讓接下來的分配更不容易產生碎片
如何針對性優化:
「讓每個目錄下的文件連續存儲」是一個極有價值的功能。
傳統的做法是通過拼接圖片來將這10張圖片合並到一張大圖中,再由前端將大圖切成10張小圖。
有了e4defrag後,可以將需連續訪問的文件放在同一個文件夾下,再定期使用e4defrag進行磁碟整理。
實現自己的文件系統:
在大部分伺服器上,不需要支持「修改文件」這個功能。一旦文件創建好,就不能再做修改操作,只支持讀取和刪除。在這個前提下,我們可以消滅所有文件碎片,把磁碟io效率提升到理論極限。
有一個公式可以衡量磁碟io的效率:
磁碟利用率 = 傳輸時間/(平均尋道時間+傳輸時間)
如若滿意,請點擊回答右側【採納答案】,如若還有問題,請點擊【追問】
~ O(∩_∩)O~
Ⅳ linux查看網路io使用率
sar -n DEV
不帶其他參數 看當天的網路IO 預設取樣時間為1秒,間隔為10分鍾
加 -f /var/log/sa/saxx可察看某日的歷史,xx為當月或上月的日期(day of the month)前提是改文件存在
察看即時IO用sar -n DEV 1 999 表示取樣間隔為1秒,取樣999次
具體欄位的含義我就不醉贅述了
Ⅳ 如何查看Linux下進程的IO活動狀況 00 Hey,Linux
前段時間,幾台測試伺服器的Web應用響應速度非常慢,系統負載也比較高,> 10, 但CPU和內存卻很閑,於是懷疑是磁碟的性能瓶頸,通過vmstat和iostat看到IO的讀寫量非常大,尤其是用iostat -x 1命令可以很直觀的看到IO的使用率一直在100%。
但究竟是什麼進程導致的高IO呢,由於每台伺服器上都有JBoss和MySQL的存在,JBoss會不停的產生很多小的數據文件和生成文本資料庫的數據,而MySQL則會不停的從Master同步新的數據。因此我們懷疑是這兩個進程導致的高IO,通過停止了JBoss和MySQL之後,IO立刻降為0%. 但我們還是不能確定誰是主因,於是尋找可以查看特定進程IO的方法。
最後,找到了兩個方法可以查看進程IO的活動狀況。
1. 第一個方法是通過一個python腳本來實現。
方法是將以下內容另存為一個叫io.py的腳本中,然後直接以root身份執行腳本,就可以看到如下圖所示的信息(由於我們已經通過升級到SSD硬碟解決了MySQL的IO問題,所以不能提供關於MySQL的截圖了),其中出現次數最多,數據最大的進程,就是導致高IO的主因。不過比較遺憾的是這個腳本並不能顯示進程在每一秒的准確的IO讀寫。
# vim io.py
# chmod +x io.py
# ./io.py
#!/usr/bin/python
# Monitoring per-process disk I/O activity
# written by http://www.vpsee.com
import sys, os, time, signal, re
class DiskIO:
def __init__(self, pname=None, pid=None, reads=0, writes=0):
self.pname = pname
self.pid = pid
self.reads = 0
self.writes = 0
def main():
argc = len(sys.argv)
if argc != 1:
print "usage: ./iotop"
sys.exit(0)
if os.getuid() != 0:
print "must be run as root"
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
os.system('echo 1 > /proc/sys/vm/block_mp')
print "TASK PID READ WRITE"
while True:
os.system('dmesg -c > /tmp/diskio.log')
l = []
f = open('/tmp/diskio.log', 'r')
line = f.readline()
while line:
m = re.match(\
'^(\S+)\((\d+)\): (READ|WRITE) block (\d+) on (\S+)', line)
if m != None:
if not l:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
continue
found = False
for item in l:
if item.pid == m.group(2):
found = True
if m.group(3) == "READ":
item.reads = item.reads + 1
elif m.group(3) == "WRITE":
item.writes = item.writes + 1
if not found:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
time.sleep(1)
for item in l:
print "%-10s %10s %10d %10d" % \
(item.pname, item.pid, item.reads, item.writes)
def signal_handler(signal, frame):
os.system('echo 0 > /proc/sys/vm/block_mp')
sys.exit(0)
if __name__=="__main__":
main()
2. 另一個方法是將Linux的內核升級到 >=2.6.20,然後安裝一個iotop軟體來實現。
不過這種改動並不適用於生產環境,因為在RHEL5.6和5.7上,內核都在 2.6.20以下。但是它所顯示的結果是非常准確的,所以對於新上線的機器以及測試環境,非常值得一試,具體方法如下:
下載和升級新內核(>=2.6.20),編譯時打開 TASK_DELAY_ACCT 和 TASK_IO_ACCOUNTING 選項。
解壓內核後進入配置界面:
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.gz
# tar jxvf linux-2.6.39.tar.gz
# mv linux-2.6.39 /usr/src/
# cd /usr/src/linux-2.6.39
# make oldconfig //使用make oldconfig可以繼承老的kernel的配置,為自己的配置省去很多麻煩。
# make menuconfig
把General setup - Enable per-task storage I/O accounting這個選項選上。
# vim .config
將#CONFIG_SYSFS_DEPRECATED_V2 is not set的注釋去掉的,將其改為y,即修改為CONFIG_SYSFS_DEPRECATED_V2=y。
保存內核後編譯內核:
# make
# make moles
# make moles_install
# make install
修改默認以新的內核啟動:
# vi /boot/grub/grub.conf
default=0
將新的內核配置文件復制到/boot目錄:
# cp /usr/src/linux-2.6.39/.config /boot/config-2.6.39
重啟伺服器:
# reboot
# uname –r
2.6.39
重啟完成後確認內核版本是否正確。
源碼安裝iotop所需的Python 2.7.2(>= 2.5):
# wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz
# tar xzvf Python-2.7.2.tgz
# cd Python-2.7.2
# ./configure
# make; make install
下載並安裝iotop:
# wget http://guichaz.free.fr/iotop/files/iotop-0.4.4.tar.bz2
# tar -xjvf iotop-0.4.4.tar.bz2
# cd iotop-0.4.4
# python setup.py build
# python setup.py install
然後就可以使用iotop看到如下圖所示的信息: