程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL 優化之 Linux系統層面調優,mysql調優

MySQL 優化之 Linux系統層面調優,mysql調優

編輯:MySQL綜合教程

MySQL 優化之 Linux系統層面調優,mysql調優


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.cnblogs.com/digdeep/p/4847484.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.cnblogs.com/digdeep/p/4850460.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.cnblogs.com/digdeep/p/4857987.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
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.cnblogs.com/digdeep/p/4863502.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級別進行關閉。

deamon的調優可以參考:http://wubx.net/category/optimize/

6. 總結:

Linux系統和硬件的調優,除了一些通用的調優之外。其它比如TCP/IP的調優,我們首先是要使用相關的各種命令查清楚瓶頸在哪裡,然後才好對症下藥。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved