詳解資料庫優化--基於linux層面的優化

2019-10-04     波波說運維

概述

介紹一下一般資料庫伺服器應該做的一些優化,這裡不涉及資料庫層面,只考慮伺服器監控和優化方面。


1、系統層面監控

主要關注以下三點。

1.1、cpu方面:

vmstat、sar 、top+P、htop、nmon、mpstat

1.2、內存:

free 、ps -aux 、top+M

1.3、IO 設備(磁碟、網絡):

iostat 、 ss 、 netstat 、 iptraf、iftop、lsof

補充:

vmstat 命令說明:

  • Procs:r 顯示有多少進程正在等待 CPU 時間。b 顯示處於不可中斷的休眠的進程數量。在等待 I/O
  • Memory:swpd 顯示被交換到磁碟的數據塊的數量。未被使用的數據塊,用戶緩衝數據塊,用於作業系統的數據塊的數量
  • Swap:作業系統每秒從磁碟上交換到內存和從內存交換到磁碟的數據塊的數量。s1 和 s0 最好是 0
  • Io:每秒從設備中讀入 b1 的寫入到設備 b0 的數據塊的數量。反映了磁碟 I/O
  • System:顯示了每秒發生中斷的數量(in)和上下文交換(cs)的數量
  • Cpu:顯示用於運行用戶代碼,系統代碼,空閒,等待 I/O 的 CPU 時間

iostat 命令說明實例命令: iostat -dk 1 5

iostat -d -k -x 5 (查看設備使用率(%util)和響應時間(await))

  • tps:該設備每秒的傳輸次數。「一次傳輸」意思是「一次 I/O 請求」。多個邏輯請求可能會被合併為「一次 I/O 請求」。
  • iops :硬體出廠的時候,廠家定義的一個每秒最大的 IO 次數,"一次傳輸"請求的大小是未知的。
  • kB_read/s:每秒從設備(drive expressed)讀取的數據量;
  • KB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;
  • kB_read:讀取的總數據量;
  • kB_wrtn:寫入的總數量數據量;這些單位都為 Kilobytes。

2、系統層面問題解決辦法

在實際的生產中,一般認為 cpu 只要不超過 90% 都沒什麼問題 ,當然不排除下面這些特殊情況:

2.1、cpu 負載高,IO 負載低

  • 內存不夠
  • 磁碟性能差
  • SQL 問題 ------>去資料庫層,進一步排查 sql 問題
  • IO 出問題了(磁碟到臨界了、raid 設計不好、raid 降級、鎖、在單位時間內 tps 過高)
  • tps 過高: 大量的小數據 IO、大量的全表掃描

2.2、IO 負載高,cpu 負載低

  • 大量小的 IO 寫操作:
  • autocommit ,產生大量小 IO
  • IO/PS 磁碟的一個定值,硬體出廠的時候,廠家定義的一個每秒最大的 IO 次數。
  • 大量大的 IO 寫操作
  • SQL 問題的幾率比較大

2.3、IO 和 cpu 負載都很高

硬體不夠了或 SQL 存在問題


3、基礎優化-- 硬體優化

3.1、主機方面:

  • 根據資料庫類型,主機 CPU 選擇、內存容量選擇、磁碟選擇
  • 平衡內存和磁碟資源
  • 隨機的 I/O 和順序的 I/O
  • 主機 RAID 卡的 BBU(Battery Backup Unit)關閉

3.2、cpu 的選擇:

  • cpu 的兩個關鍵因素:核數、主頻
  • 根據不同的業務類型進行選擇:
  • cpu 密集型:計算比較多,OLTP 主頻很高的 cpu、核數還要多
  • IO 密集型:查詢比較,OLAP 核數要多,主頻不一定高的

3.3、內存的選擇:

  • OLAP 類型資料庫,需要更多內存,和數據獲取量級有關。
  • OLTP 類型數據一般內存是 cpu 核心數量的 2 倍到 4 倍,沒有最佳實踐。

3.4、存儲方面:

  • 根據存儲數據種類的不同,選擇不同的存儲設備
  • 配置合理的 RAID 級別(raid 5、raid 10、熱備盤)
  • 對與作業系統來講,不需要太特殊的選擇,最好做好冗餘(raid1)(ssd、sas 、sata)

3.5、raid 卡:主機 raid 卡選擇:

  • 實現作業系統磁碟的冗餘(raid1)
  • 平衡內存和磁碟資源
  • 隨機的 I/O 和順序的 I/O
  • 主機 RAID 卡的 BBU(Battery Backup Unit)要關閉

3.6、網絡設備方面:

使用流量支持更高的網絡設備(交換機、路由器、網線、網卡、HBA 卡)

注意:以上這些規劃應該在初始設計系統時就應該考慮好。


4、作業系統優化

Cpu:

基本不需要調整,在硬體選擇方面下功夫即可。

內存:

基本不需要調整,在硬體選擇方面下功夫即可。

SWAP:

MySQL 儘量避免使用 swap。阿里雲的伺服器中默認 swap 為 0

IO :

  • raid、no lvm、 ext4 或 xfs、ssd、IO 調度策略
  • Swap 調整(不使用 swap 分區)

這個參數決定了 Linux 是傾向於使用 swap,還是傾向於釋放文件系統 cache。在內存緊張的情況下,數值越低越傾向於釋放文件系統 cache。當然,這個參數只能減少使用 swap 的機率,並不能避免 Linux 使用 swap。

修改 MySQL 的配置參數 innodb_flush_method,開啟 O_DIRECT 模式。這種情況下,InnoDB 的 buffer pool 會直接繞過文件系統 cache 來訪問磁碟,但是redo log 依舊會使用文件系統 cache。值得注意的是,Redo log 是覆寫模式的,即使使用了文件系統的 cache,也不會占用太多。


5、系統參數調整

Linux 系統內核參數優化:

vim /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65535 # 用戶埠範圍
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 30
fs.file-max=65535 # 系統最大文件句柄,控制的是能打開文件最大數量

用戶限制參數:

vim /etc/security/limits.conf 
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535

6、不相干應用優化

業務應用和資料庫應用獨立,防火牆:iptables、selinux 等其他無用服務(關閉):

chkconfig --level 23456 acpid off
chkconfig --level 23456 anacron off
chkconfig --level 23456 autofs off
chkconfig --level 23456 avahi-daemon off
chkconfig --level 23456 bluetooth off
chkconfig --level 23456 cups off
chkconfig --level 23456 firstboot off
chkconfig --level 23456 haldaemon off
chkconfig --level 23456 hplip off
chkconfig --level 23456 ip6tables off
chkconfig --level 23456 iptables off
chkconfig --level 23456 isdn off
chkconfig --level 23456 pcscd off
chkconfig --level 23456 sendmail off
chkconfig --level 23456 yum-updatesd off

覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~

文章來源: https://twgreatdaily.com/zh/nyqMk20BMH2_cNUgSZEZ.html