MySQL 優化之 Linux系統層面調優
MySQL 一般運行於Linux系統中。對於MySQL的調優一般分為Linux操作系統層面的調優和MySQL層面的調優(當然還有架構層面、業務層面、應用程序層面的調優)。操作系統主要是管理和分配硬件資源,所以其實系統層面的調優包括了硬件的調優,也就是調整硬件參數。Linux系統層面的調優一般分為 CPU的調優、內存的調優、磁盤的調優、網絡的調優、Linux後台service調優等等。
1. CPU 調優
1.1 CPU 的節能模式
在server環境的CPU一定要關閉節能模式,節能模式不適應於服務器環境。因為他會自動給CPU降頻進入休眠模式!一般筆記本電腦,手機為了續航時間,才需要。關閉CPU的節能模式有兩種方法:
1)在BIOS中進行設置,徹底關閉;
2)關閉Linux中的服務 cpuspeed 和 irqbalance;
[root@localhost ~]# chkconfig --level 35 cpuspeed off
[root@localhost ~]# chkconfig | grep cpuspeed
cpuspeed 0:off 1:on 2:off 3:off 4:off 5:off 6:off
[root@localhost ~]# chkconfig --level 35 irqbalance off
[root@localhost ~]# chkconfig | grep irqbalance
irqbalance 0:off 1:off 2:off 3:off 4:off 5:off 6:off
cpuspeed 就是負責CPU節能的後台服務;而irqbalance在cpuspeed將某個或某幾個CPU調節進入休眠模式時,它負責將中斷發送到沒有休眠的CPU。關閉irqbalance會將所有中斷均衡的發送到所有cpu.
1.2 關閉CPU的numa
numa的會導致mysqld產生swap,嚴重影響性能。因為numa架構的CPU和內存是bind的,如果CPU自己node中的內存不夠,就會導致swap的產生,即使此時其它node中有大量的空閒內存,它也不會去使用。這就是numa的一個缺陷。有多種方法關閉CPU的numa:
1)在BISO中進行配置;
2)numactl --interleave=all
[root@localhost ~]# numactl --interleave=all
interleave=all 其實是將NUMA架構的各個node中的內存,又重新虛擬成了一個共享的內存來進行分配,但是和SMP不同的是,因為每兩個node之間有 inter-connect ,所以又避免了SMP架構總線爭用的缺陷。
查看CPU是否被休眠導致降頻:
[root@localhost ~]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Xeon(R) CPU E5405 @ 2.00GHz
stepping : 10
cpu MHz : 1995.288
看上面的 cpu MHz : 1995.288 和 實際是否一致。
具體參見:http://www.Bkjia.com/database/201510/445109.html
2. 內存的調優
內存主要是要防止發生 swap。因為發生swap的話,從內存訪問直接下降為硬盤訪問,隨機訪問的速度下降10的6次方倍,也就是10萬倍。順序訪問下降10倍左右。
2.1 防止發生swap:
1)關閉CPU的numa,防止numa導致的swap;
2)設置 vm.swappiness=1; 在 /etc/sysctl.conf 中添加:vm.swappiness=1,然後 sysctl -p; 也可以 sysctl vm.swappiness=1臨時修改,然後sysctl -p
注意:在RHEL/CentOS 6.4及更新的內核中 vm.swappiness = 0 的默認行為被修改了,如果繼續設置vm.swappiness = 0,
有可能導致系統內存溢出,從而導致MySQL被意外kill掉。所以這裡我們設置為 1 而不是傳統的 0.
3)設置 /proc/$(pidof -s mysqld)/oom_adj為較小的值(-15,-16或者-17)來盡量避免MySQL由於內存不足而被關閉
[root@localhost ~]# echo -17 > /proc/$(pidof mysqld)/oom_adj
[root@localhost ~]# cat /proc/$(pidof mysqld)/oom_adj
-17
這個oom_adj中的變量的范圍為15到-16之間。越大越容易在內存不足時被kill。-17 則表示該進程不會被kill掉,當內存不足時,會kill其它進程。
4)使用 hugepage 可以避免swap out; 但是 huagepage也是有代價的(導致page爭用加劇)。
2.2 在BIOS 設置內存為最大性能模式;
2.3 調節 disk cache 刷新到磁盤的行為
因為Linux默認會大量的進行文件cache,也就是將大量內存用於disk cache。這樣的話,會影響mysql使用內存。所以我們可以調節disk cache在髒塊達到多大的百分比時,進行刷新。vm.dirty_background_ratio=10; 默認值為10,表示disk cache中的髒頁數量達到10%時,pdflush內核線程會被調用,異步刷新disk cache; vm.dirty_ratio=20; 表示disk cache中的髒頁數量達到20%時,會進行同步的disk cache刷新,從而會阻塞系統中應用進程的IO操作!我們可以調低vm.dirty_background_ratio來降低disk cache對mysql使用內存的影響,但是可能會增加磁盤IO,因為文件cache減少了,增加其他進程的page fault;(vm.dirty_background_ratio / vm.dity_ratio 帶有backround表示異步刷新,沒有帶的是同步刷新。)
具體參見:http://www.Bkjia.com/database/201510/445112.html
3. 磁盤IO的調優
磁盤IO的調優涉及到文件系統的調優和磁盤的調優。
3.1 文件系統的調優
1)文件系統的選擇:在rhel6.4之前ext4性能比xfs好,因為xfs有lock爭用的bug。但是6.4開始,xfs的bug被fix了。測試表明xfs性能比ext4好。
2)文件掛載選項:文件掛載時啟用noatime,nodiratime,可以在 /etc/fstab 中進行修改。
具體參見:http://www.Bkjia.com/database/201510/445114.html
3.2 磁盤的調優
1)IO調度算法:mysql服務器一定不要使用默認的CFQ調度算法。如果是SSD,那麼應該使用NOOP調度算法,如果是磁盤,就應該使用Deadline調度算法。
修改方法:
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
[root@localhost ~]# echo noop > /sys/block/sda/queue/scheduler
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
[noop] anticipatory deadline cfq
這是臨時修改,重啟失效。永久修改,需要修改文件 /boot/grub/menu.lst 中的elevator=deadline 或者noop:
# vi /boot/grub/menu.lst
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
2)加大內存,可以使mysql緩存更大的內容,減少IO操作。
3)磁盤RAID10 或者 換SSD;
4)適當的采用Nosql(redis/mongdb/ssdb)等減輕mysql的負擔;也可以架構master-slave減輕master的IO壓力。
5)使用memcache或者reids在mysql前面加一層緩存,減輕磁盤IO;
具體參見:http://www.Bkjia.com/database/201510/445288.html
4. 網絡調優
網絡調優分為硬件層面和TCP/IP軟件層面參數的調優。
4.1 網絡硬件調優:
1)換延遲更小,throught更大的網卡;
2)雙網卡綁定,進行負載均衡和高可用;
4.2 TCP/IP參數調優:
1)socket buffer 參數調節:
1>/proc/sys/net/ipv4/tcp_mem TCP全局緩存,單位為內存頁(4k);
對應的內核參數:net.ipv4.tcp_mem ,可以在 /etc/sysctl.conf 中進行修改;
2>/proc/sys/net/ipv4/tcp_rmem 接收buffer,單位為字節
對應的內核參數:net.ipv4.tcp_rmem, 可以在 /etc/sysctl.conf 中進行修改;
3>/proc/sys/net/ipv4/tcp_wmem 接收buffer,單位為字節
對應的內核參數:net.ipv4.tcp_wmem, 可以在 /etc/sysctl.conf 中進行修改;
4>/proc/sys/net/core/rmem_default 接收buffer默認大小,單位字節
對應內核參數:net.core.rmem_default, 可以在 /etc/sysctl.conf 中進行修改;
5>/proc/sys/net/core/rmem_max 接收buffer最大大小,單位字節
對應內核參數:net.core.rmem_max, 可以在 /etc/sysctl.conf 中進行修改;
6>/proc/sys/net/core/wmem_default 發送buffer默認大小,單位字節
對應內核參數:net.core.rmem_default, 可以在 /etc/sysctl.conf 中進行修改;
7>/proc/sys/net/core/wmem_max 發送buffer最大大小,單位字節
對應內核參數:net.core.rmem_max, 可以在 /etc/sysctl.conf 中進行修改;
2)offload配置:
將tso,checksum等功能交給網卡硬件來完成:
ethtool -K eth0 rx on|off
ethtool -K eth0 tx on|off
ethtool -K eth0 tso on|off
3)調大網卡的接收隊列和發送隊列:
1>接收隊列:/proc/sys/net/core/netdev_max_backlog 對應內核參數:net.core.netdev_max_backlog
2>發送隊列:
查看大小:ifconfig eth0 | grep txqueue
修改大小:ifconfig eth0 txqueuelen 20000
4)調大 SYN 半連接 tcp_max_syn_backlog 數量:
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
也可以在/etc/sysctl.conf文件中配置。
5)net.core.somaxconn :
該參數為完成3次握手,已經建立了連接,等待被accept然後進行處理的數量。默認為128,我們可以調整到 65535,甚至更大。也就是尅有容納更多的等待處理的連接。
MTU 大小 調優:
如果TCP連接的兩端的網卡和網絡接口層都支持大的 MTU,那麼我們就可以配置網絡,使用更大的mtu大小,也不會導致被 切割重新組裝發送。
配置命令:ifconfig eth0 mtu 9000 up
6)TCP連接的 CLOSE_WAIT 和 TIME_WAIT
如果TCP連接的 CLOSE_WAIT 和 TIME_WAIT 狀態過多時,分別需要調優TCP的keepalive相關的參數和TCP的回收相關的參數。
TCP/IP的調優極其復雜,具體參見博文:http://www.cnblogs.com/digdeep/p/4869010.html
5. Linux 系統中的各種後台daemon的調優
Linux系統中存在各種各樣的後台daemon,也就是各種service,對於mysql服務器來說很多沒有必要的service就可以痛痛關閉掉。
mysql的最小化的後台服務,可以只有:crond,sshd,rsyslog,network,sysstat
當然如果有需要可以在增加其他服務。
使用 chckconfig --level 35 servicename off; 可以進行關閉。35表示在runlevel的level =3 和 level =5級別進行關閉。
6. 總結:
Linux系統和硬件的調優,除了一些通用的調優之外。其它比如TCP/IP的調優,我們首先是要使用相關的各種命令查清楚瓶頸在哪裡,然後才好對症下藥。