MySQL相關的優化
一、CPU資源和可用內存大小
1、如何選用CPU
問?我們需要更快的cpu還是更多的cpu
答:我們想要更快的cpu還要更多的cpu顆數(痴心做夢)
解答:首先我們需要判斷我們的服務是否為cpu密集型的業務,如果是,則應該選擇更快的cpu,以加快SQL語句的查詢速度。其次我們應該考慮我們系統的並發量的問題,單個cpu無法利用多核心的資源,我們要提高系統的吞吐量和並發量應該選擇更多的cpu,再有我們應該考慮我們本身業務需要使用過的MySQL的版本,對於5.0以前的MySQL,並不能充分的使用多核心cpu。建議使用5.6+的版本
注意:如果服務器的性能很好,別手殘的選擇安裝32位的操作系統,因為pow(2, 32)=4G,也是我們艹內存,只能最多艹4G,多余的4G的內存無法使用
2、內存
問?內存應該怎么優化
答:內存越多越好,但是對性能影響有限並不能無限的增加性能
解答:服務器的內存,我們應該組成購買升級,並且每個通道的內存應選擇相同品牌、顆粒、頻率、電壓、校驗技術和型號,另外我們需要根據數據庫的大小來選擇內存,另外應該配置更多內存以避免內存不足造成性能下降(選用128G或者256G以上的內存)!
二、磁盤的配置和選擇
可用選擇:
1、使用傳統機器硬盤
優點:存儲空間大、價格低廉
缺點:讀寫速度較慢,但是選擇使用的較多
需要考慮的點:存儲容量、傳統速度、訪問時間、主軸的轉速(7200轉或更高的轉速)、物理磁盤的尺寸
2、使用RAID增強傳統機器磁盤的性能
簡介:RAID是磁盤冗余隊列的簡稱(Readundant Arrays of Independent Disks),簡單來說就是RAID的作用就是可以把多個容量小的磁盤組成一組容量更大的磁盤,並提供數據完整性的技術
raid0:具有讀寫加速的技術,磁盤使用率是3塊磁盤的和,但是磁盤的損壞率是一塊盤的n倍(N塊磁盤),適用於MySQL的salve端
raid1:具有冗余的功能,磁盤利用率為n/2,因為需要把另外的一半磁盤作為備份盤使用,適用對數據要求安全速度無要求的業務,例如日志或者傳統的監控系統
raid5:通過分布式奇偶校驗塊的把數據分散到多個磁盤上,這樣如果任何一塊盤數據失效,都可以從奇偶盤中重建,如果兩塊盤掛掉了,整個磁盤陣列就GG了!比較中庸的解決方案,需要損失一塊盤的空間作為奇偶校驗盤~
raid10:它是對磁盤先做raid1以后再對兩組raid1磁盤做raid0,所以對讀寫都有良好的性能,相對於raid5重建起來更簡單,速度也更快!適用於存儲的主節點或者MySQL的主節點~
3、使用固態存儲SSD和PCIE卡
優點:相比機械磁盤固態磁盤有更好的隨機讀寫性能,相比機械磁盤能更好的支持並發
缺點:更容易的損壞,成本高
使用場景:適用於大量的隨機I/O的場景,使用於解決單線程負載的I/O瓶頸
注意:
如果只有一塊固態磁盤,我們應該給他放到主服務器還是從服務上?
如果只有一塊固態磁盤的話,建議放到從服務器上,以減少主從同步的時間,減少固態的讀寫
三、CentOS系統參數調優
相關的參數調整:
1、內核相關的參數(/etc/sysctl.conf)
net.coro.somaxconn=65535
net.coro.netdev_max_backlog=65535
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_fin_timeout=10
net.ipv4.tcp_tw__reuse=1
net.ipv4.tcp_tw_revycle=1
net.core.wmem_default=87380
net.core.wmem_max=16777216
net.core.rmem_default=87380
net.core.rmem_max=16777216
net.ipv4.tcp_keepalive_time=120
net.ipv4.tcp_keppalive_intvl=30
net.ipv4.tcp_keepalive_probes=3
kernel.shmmax=4294967295
注意:這個值的大小對於64位的Linux系統,可取的最大值為物理內存值-1byte,建議值為大於物理內存的一半,一般取值大於Innodb緩存池的大小即可,可以取物理內存-1bytes
2、增加資源限制(/etc/security/limit.conf)
* soft nofile 65535
* hard nofile 65535
解釋:
* 表示對所有用戶有效
soft 指的是當前系統生效的設置
hard 表明系統中所能設定的最大值
nofile 表示所限的資源是打開文件的最大數目
65536 就是限制的數量
3、磁盤調度策略(/sys/block/devname/queue/scheduler)
cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
noop(電梯式調度策略):
NOOP實現了一個FIFO隊列,它像是電梯的工作方法一樣對I/O請求進行組織,當有一個新的請求過來時,它將請求合並到最近的請求以后,以此來保證請求同一個介質,NOOP傾向於餓死讀而利於寫,因此NOOP對於閃存設備、RAM及嵌入式系統是最好的選擇。
deadline(截止時間調度策略)
Deadline確保了在一個截止時間內服務請求,這個截止時間是可調整的,而默認讀期限短與寫期限。這樣就能防止寫操作因為不能被讀取而餓死的現象,Deadline對數據庫類是最好的選擇
anticipatory(預料I/O調度策略)
本質上與Deadline一樣,但是最后一次讀操作后,要等待6ms,才能繼續進行對其他I/O請求進行調度。它會在每個6ms,才能中插入新的I/O操作,而會將一些小寫入流合並為一個大寫入流,用寫入延遲換取最大的寫入吞吐量。AS時而好與寫入較多的環境,比如文件系統,AS對數據庫表現極差!
更改調度策略的方法:
echo "schedulername" /sys/block/devname/deque/scheudler
四、文件系統對性能的相應
EXT3/4系統的掛載參數(/etc/fstab)
data = writeback | ordered | journal
writeback:非同步的寫入,速度最快
ordered: 不記錄元數據,但是提供了一致性的保證,在寫原元數據之前,先寫入數據,使他們保存一致,稍慢與writebak
journal: 日志
noatime, nodiratime (掛載選項的時候可以設置的相關參數,例如不更新訪問時間,目錄的時間,以提升I/O的性能)
/dev/sda1/ etx4 notime, nodiratime, data=writeback 1 1 (fstab中的優化參數)
可以通過追加重定向的命令把參數傳遞到fstab中
#] echo "/dev/sda1/ etx4 notime, nodiratime, data=writeback 1 1" >> /etc/fstab
原創作品,轉載請注明出處:http://www.cnblogs.com/demon89/p/mysql_optimization.html