linux上查看io狀態和簡單優化

一、安裝需要的命令:iostat
    yum install -y sysstat
	
	
二、常用的命令:
    1:一秒刷新一次,總共刷新10次(磁盤讀寫速度單位爲KB)
       iostat -d -x -k 1 10
    2:查看TPS和吞吐量信息(磁盤讀寫速度單位爲KB)   1秒刷新一次,共刷新10次	   
	   iostat -d -k 1 10 
    3:查看TPS和吞吐量信息(磁盤讀寫速度單位爲MB)   2秒刷新一次,一直刷       
       iostat -d -m 2            
	4:一秒刷新一次,總共刷新10次(磁盤讀寫速度單位爲KB)
	   iostat -d -x -k 1 10   
	

三、命令使用詳解
    這個值await>15,這個值%util接近100那就說明,磁盤現在是整個系統性能的瓶頸了
3.1:命令1	
     [root@xwah]# iostat -d -x -k 1 10   
     Linux 3.10.0-514.el7.x86_64 (xjq6-db) 	05/08/2019 	_x86_64_	(16 CPU)
     
     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               0.68    20.39   65.59  687.50  1865.75 10244.61    32.16     0.13    0.17    0.91    0.10   0.24  17.90
     dm-0              0.00     0.00   66.63  412.82  1865.75 10244.59    50.52     0.06    0.12    0.93    0.62   0.37  17.93
     dm-1              0.00     0.00    0.00    0.00     0.00     0.02     8.01     0.00  373.85    2.58  380.00   0.69   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               0.00     0.00    7.00  594.00   104.00 10061.00    33.83     0.38    0.63    0.57    0.63   0.12   7.30
     dm-0              0.00     0.00    7.00  335.00   104.00  9997.00    59.07     0.38    1.12    0.57    1.13   0.22   7.40
     dm-1              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
     
     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               0.00     0.00    3.00  732.00    36.00 10773.50    29.41     0.43    0.59    0.67    0.59   0.13   9.30
     dm-0              0.00     0.00    3.00  395.00    36.00 10773.50    54.32     0.43    1.08    0.67    1.09   0.23   9.10
     dm-1              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
     
     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               0.00     0.00    2.00 1061.00     8.00 16602.00    31.25     0.99    0.94    0.50    0.94   0.16  17.10
     dm-0              0.00     0.00    2.00  580.00     8.00 16602.00    57.08     1.00    1.72    1.00    1.72   0.30  17.70
     dm-1              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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 以上命令的詳解  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

查看主要參數:
avgqu-sz  數值越小越好
await     等待時間的數值<5,正常,數值>10偏高了
svctm     svctm與await的值越接近越好,如果await減去svctm的值,值越大隊列時間越長,說明系統出了問題
%util     值越大,設備越繁忙,接近100%表示設備接近滿負荷運行了
r/s w/s   表示每秒讀的次數,寫的次數
avgqu-sz  值越小越好,該數值很重要 

磁盤的 avgqu-sz數值很大;await數值很高;%util數值很高;都可能預示着磁盤存在瓶頸或者磁盤出現問題或者故障。


參數說明:
rrqm/s   每秒這個設備相關的讀取請求有多少被Merge了(當系統調用需要讀取數據的時候,VFS將請求發到各個FS,如果FS發現不同的讀取請求讀取的是相同Block的數據,FS會將這個請求合併Merge)
wrqm/s   每秒這個設備相關的寫入請求有多少被Merge了
r/s w/s  表示每秒讀的次數,寫的次數
rsec/s   每秒讀取的扇區數
wsec/    每秒寫入的扇區數
rKB/s    每秒發送到設備的讀取請求數
wKB/s    每秒發送到設備的寫入請求數
avgrq-sz 平均請求扇區的大小
avgqu-sz 是平均請求隊列的長度。毫無疑問,隊列長度越短越好,該數值很重要   
await    每一個IO請求的處理的平均時間(單位是微秒毫秒),這裏可以理解爲IO的響應時間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了。
         這個時間包括了隊列時間和服務時間,也就是說,一般情況下,await大於svctm,它們的差值越小,則說明隊列時間越短,反之差值越大,隊列時間越長,說明系統出了問題。
svctm    表示平均每次設備I/O操作的服務時間(以毫秒爲單位),如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,如果await的值遠高於svctm的值,
     則表示I/O隊列等待太長系統上運行的應用程序將變慢
%util    該參數暗示了設備的繁忙程度,一般地,如果該參數是100%表示設備已經接近滿負荷運行了
    (當然如果是多磁盤,即使%util是100%,因爲磁盤的併發能力,所以磁盤使用未必就到了瓶頸)
await    每一個IO請求的處理的平均時間(單位是微秒毫秒),這裏可以理解爲IO的響應時間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了
svctm    表示平均每次設備I/O操作的服務時間(以毫秒爲單位),如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,
         如果await的值遠高於svctm的值,則表示I/O隊列等待太長,系統上運行的應用程序將變慢
3.2;命令2
     iostat -d -k 1 10         #查看TPS和吞吐量信息(磁盤讀寫速度單位爲KB)   1秒刷新一次,共刷新10次
     iostat -d -m 2            #查看TPS和吞吐量信息(磁盤讀寫速度單位爲MB)   2秒刷新一次,一直刷

     [root@xwah]# iostat -d -m 2
     Linux 3.10.0-514.el7.x86_64 (xjq6-db) 	05/08/2019 	_x86_64_	(16 CPU)
     
     Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
     sda             753.10         1.82        10.00   29746804  163323047
     dm-0            479.46         1.82        10.00   29746770  163322744
     dm-1              0.00         0.00         0.00          5        300
     
     Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
     sda            1349.00         2.92        22.29          5         44
     dm-0           1301.50         2.93        22.16          5         44
     dm-1              0.00         0.00         0.00          0          0
     
     
     命令輸出的詳解:
     kB_read/s:每秒從設備(drive expressed)讀取的數據量
     kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量
     kB_read:  讀取的總數據量
     kB_wrtn:  寫入的總數量數據量



三、查看mysqld的IO:
    iotop -k -u mysql   (-k 表示KB,-u mysql表示顯示mysql用戶的所有進程的IO)
四、對於mysql的簡單優化

4.1:對db系統的調優,調節的IO調度算法(如果是SSD固態硬盤,選擇noop調度算法,如果是磁盤,那麼選擇deadline調度算法)
[root@xwah]# lsscsi
[1:0:0:0]    disk    ATA      SanDisk SD8SBBU2 6000  /dev/sda 
[root@xwah]# iostat -d -m  1 1 |awk '{print $1}' | grep -v Linux
Device:
sda
dm-0
dm-1
dm-2
  
1:調節磁盤調度算法
   echo deadline > /sys/block/dm-0/queue/scheduler
   echo deadline > /sys/block/dm-1/queue/scheduler 
   echo deadline > /sys/block/dm-2/queue/scheduler

2:在線調整InnoDB緩衝池大小 8G(5.7之前不能動態調整,要修改配置文件重啓mysql生效)
   mysql> SET GLOBAL innodb_buffer_pool_size = 8589934592;
   查看:
   mysql> show variables like '%innodb_buffer_pool%';


3:在關係到磁盤IO的參數還有兩個,分別是:innodb_log_buffer_size和innodb_log_file_size       

    innodb_log_buffer_size   
	表示InnoDB寫入到磁盤上的日誌文件時使用的緩衝區的字節數,默認值爲8M。
	一個大的日誌緩衝區允許大量的事務在提交之前不寫日誌到磁盤。
	因此,如果你有很多事務的更新,插入或刪除很多操作,通過這個參數會大量的節省了磁盤I/O。

    innodb_log_file_size   不能超過最高值512GB,通常來說32M~128M這樣的配置就可以了
	表示在一個日誌組每個日誌文件的字節大小。  
	日誌文件的總大小(innodb_log_file_size* innodb_log_files_in_group)。
	例如一對255 GB的日誌文件,已經接近了極限,不能超過它。默認值是48M。
	比較合適的值的範圍是從1MB到1 / N個的緩衝池大小,其中N是該組中的日誌文件的數量。
	該值越大,緩衝池中必要的檢查點刷新活動就會越少,節省磁盤I/O。但是越大的日誌文件,mysql的崩潰恢復就越慢
	
	innodb_log_files_in_group = 3  控制事務日誌文件的個數,一般我們可以用2-3個日值組。默認爲兩個
	
4:	如果系統 讀>寫,可以設置innodb_read_io_threads值相對大點,反之也可以,設置成cpu核數就行,最大cpu核數*2
    innodb_read_io_threads = 4
    innodb_write_io_threads = 4
5:mysql內執行如下指令:
   set global sync_binlog=500;  默認爲 0
   當每進行500次事務提交之後,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤。
   
   set global innodb_flush_log_at_trx_commit=2; 之前爲 1
   默認值1代表每一次事務提交或事務外的指令都需要把日誌寫入(flush)硬盤,這是很費時的。特別是使用電池供電緩存(Battery backed up cache)時。
   設置爲2代表不寫入硬盤而是寫入系統緩存。日誌仍然會每秒flush到硬盤,所以你一般不會丟失超過1-2秒的更新。
   設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的數據。而值設置爲2只會在整個操作系統宕機時纔可能丟數據。
   注:重新開機後,該指令失效。可在服務啓動時,設置如上兩項
 
 
5.1參數sync_binlog和innodb_flush_log_at_trx_commit的詳解
   寫入性能最好
     innodb_flush_log_at_trx_commit=2 
     sync_binlog=1000
   
   寫入性能一般
     innodb_flush_log_at_trx_commit=1 
     sync_binlog=1000
   
   寫入性能最差
     innodb_flush_log_at_trx_commit=1 
     sync_binlog=1

5.2安全
   1)當innodb_flush_log_at_trx_commit和sync_binlog  都爲 1 時是最安全的,但也是最慢的一種方式。在mysqld 服務崩潰或者服務器主機crash的情況下,
      binary log 只有可能丟失最多一個語句或者一個事務。但是魚與熊掌不可兼得,雙11 會導致頻繁的io操作,因此該模式也是最慢的一種方式。
   2)當innodb_flush_log_at_trx_commit設置爲0,該模式速度最快,但不太安全,mysqld進程的崩潰會導致上一秒鐘所有事務數據的丟失。
   3)當innodb_flush_log_at_trx_commit設置爲2,該模式速度較快,也比0安全,只有在操作系統崩潰或者系統斷電的情況下,上一秒鐘所有事務數據纔可能丟失。


5.3磁盤IO無法滿足業務需求時(雙1適合數據安全性要求非常高)
   推薦 innodb_flush_log_at_trx_commit=2 ,sync_binlog=N (N爲500 或1000 或者 > 1) 
  
6:開啓並分析慢日誌:優化sql語句
   cat /tmp/mysql-slow.log

   SET timestamp=1548075938;
   update xy_member_session  set accessTime= 1548075935 where id=188444;
   # User@Host: root[root] @  [192.168.134.102]  Id: 1286945
   # Query_time: 2.840616  Lock_time: 0.000074  Rows_sent: 0  Rows_examined: 1
     執行時間              等待鎖的時間         
7:mysql配置文件如下:
   vim /etc/my.cnf

   [mysqld] #此模塊下增加以下參數
   innodb_log_buffer_size = 50M         
   innodb_flush_log_at_trx_commit = 2   
   innodb_buffer_pool_size = 8G         #專門的db服務器使用內存的80%,不是專門的使用40%      
   innodb_read_io_threads = 16          #cpu的核數,均勻使用cpu
   innodb_write_io_threads = 16         #cpu的核數,均勻使用cpu
   sync_binlog = 10                     
   innodb_log_files_in_group = 3    
   slow_query_log  = ON                         #開啓慢日誌
   slow_query_log_file   = /tmp/mysql-slow.log  #設置慢日誌的路徑和名稱
   long_query_time     = 2                      #設置慢日誌的時間(超時2s的sql語句就記錄下來)
~~~~~~~~~~~~~~~~~~ 其他的優化 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   1:讀寫分離進行磁盤IO優化
   2:在前端加上memcache/redis緩存
   3:選擇正確的文件系統也能提高磁盤的tps,mysql數據庫推薦使用XFS文件系統
~~~~~~~~~~~~~~ 系統配置和mysql配置優化的總結 ~~~~~~~~~~~~
1:調節磁盤調度算法
   echo deadline > /sys/block/dm-0/queue/scheduler
   echo deadline > /sys/block/dm-1/queue/scheduler 
   echo deadline > /sys/block/dm-2/queue/scheduler
   
2:mysql配置文件如下:
   vim /etc/my.cnf

   [mysqld] #此模塊下增加以下參數
   innodb_log_buffer_size = 50M         
   innodb_flush_log_at_trx_commit = 2   
   innodb_buffer_pool_size = 8G         #專門的db服務器使用內存的80%,不是專門的使用40%      
   innodb_read_io_threads = 16          #cpu的核數,均勻使用cpu
   innodb_write_io_threads = 16         #cpu的核數,均勻使用cpu
   sync_binlog = 10                     
   innodb_log_files_in_group = 3    
   slow_query_log  = ON                         #開啓慢日誌
   slow_query_log_file   = /tmp/mysql-slow.log  #設置慢日誌的路徑和名稱
   long_query_time     = 2                      #設置慢日誌的時間(超時2s的sql語句就記錄下來)
是在沒有辦法就,購買更好的服務器,把站點搬遷吧

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章