服務器優化html
cpu,內存,磁盤,網卡node
服務器選型
--少核高頻,向多核低頻的發展趨勢明顯
--ddr4內存的普及,起始頻率妖上更高的臺階
--ssd硬盤使用愈來愈多,NVMe蓄勢待發
--萬兆更普及,萬兆條線從新選型mysql
DB服務器標準化配置
2*E5 2690 V3/128 GBlinux
CPU優化
cpu架構,物理硬件,在操做系統看來
cpu生產環境,cpu多進程,多線程,cpu調度器
#lscpu
#cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -cios
內存優化
numa(non uniform memory access)
numa架構內存分配不均
#numactl --hardware
free內存有8個G,但節點0只有314M free內存,內存分配很是不平均,當mysql須要大量free內存時,就會出現競爭
解決free內存不足和numa架構內存分配不均
1 .保證系統有足夠多free內存,這個能夠經過設置內存參數
vm.min_free_kbytes = NNNNN --當系統free內存少於這個時,內核會啓動回收內存,進程在分配內存時也會啓動回收內存
vm.extra_free_kbytes = NNNNN --當系統free內存少於這個時,內核會從pagecache回收內存(用戶進程不會回收內存)
--其餘
[root@hongquan1 3306]# cat /proc/sys/vm/panic_on_oom
0
vm.panic_on_oom 默認爲0開啓 爲1時表示關閉此功能
等於0時,表示當內存耗盡時,內核會觸發OOM killer殺掉最耗內存的進程
當OOM Killer被啓動時,經過觀察進程自動計算得出各當前進程的得分 /proc/<PID>/oom_score,分值越高越容易被kill掉
並且計算分值時主要參照 /proc/<PID>/oom_adj , oom_adj 取值範圍從-17到15,當等於-17時表示在任什麼時候候此進程都不會被 oom killer kill掉(適用於mysql)
/proc/[pid]/oom_adj ,該pid進程被oom killer殺掉的權重,介於 [-17,15]之間,越高的權重,意味着更可能被oom killer選中,-17表示禁止被kill掉。
/proc/[pid]/oom_score,當前該pid進程的被kill的分數,越高的分數意味着越可能被kill,這個數值是根據oom_adj運算後的結果,是oom_killer的主要參考。
sysctl 下有2個可配置選項:
vm.panic_on_oom = 0 #內存不夠時內核是否直接panic
vm.oom_kill_allocating_task = 1 #oom-killer是否選擇當前正在申請內存的進程進行kill算法
2 在忽然大量鏈接到來以前保留足夠free內存
3. 採用交叉內存分配模式啓動mysql或其它須要大內存的系統,保持多個節點之間內存分配平衡numactl --interleave all 《command》
4. 優化mysql的%buffer%等參數內存分配,避免過大不合理參數
關閉numa
grep -i numa /var/log/dmesg #如何判斷一個多核機器linux是否爲numa結構
[root@mysql1 soft]# grep -i numa /var/log/dmesg
[ 0.000000] NUMA: Initialized distance table, cnt=4sql
單機單實例,建議關閉numa
--bios中關閉
--os內核,啓動是設置numa=off
--mysql啓動時候,關閉numa特性 --interleave all
numactl --interleave=all /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysqldata/3306/my.cnf &數據庫
mysql 5.6.27,5.7.9有參數innodb_numa_interleave=OFF/ON
多實例能夠用numa,多實例用偶數,提供內存效率
內存插法:2/2/1/1,2/2/2/0緩存
----http://imysql.com/2015/05/24/mysql-optimization-reference-1.shtml
一、選擇Performance Per Watt Optimized(DAPC)模式,發揮CPU最大性能,跑DB這種一般須要高運算量的服務就不要考慮節電了;
二、關閉C1E和C States等選項,目的也是爲了提高CPU效率;
三、Memory Frequency(內存頻率)選擇Maximum Performance(最佳性能);
四、內存設置菜單中,啓用Node Interleaving,避免NUMA問題;
---安全
IO優化
--磁盤的訪問模式
順序訪問性能較好100M/S,磁盤吞吐率
隨機訪問性能較差,iops較低
io per second
機械硬盤:100~200
固態硬盤:50000+
--磁盤的分類
SATA II 機械磁盤 7200 RPM IOPS: ~100
SAS 機械磁盤15K RPM IOPS: ~200
SSDIOPS: ~50000+
提高iops性能手段
RAID技術--功耗高
購買共享存儲設備--價格高
RAID卡
一、 查看電量百分比
# megacli-AdpBbuCmd-GetBbuStatus-aALL|grep"Relative State of Charge"
二、 查看充電狀態
# megacli-AdpBbuCmd-GetBbuStatus-aALL|grep"Charger Status"
查看緩存策略
[root@test_raid~]#megacli-LDGetProp-Cache-LALL-a0
Adapter0-VD0(targetid:0):CachePolicy:WriteBack,ReadAdaptive,Direct,NoWriteCacheifbadBBU
SSD選擇
PCIE or SATA
SATA益於安裝與升級
SATA與PCIE的性能差距逐漸縮小
PCIE的性能不多有應用能夠徹底使用
優先選擇SATA接口的SSD
SSD品牌推薦
Intel
Fusion IO
寶存
#lspci -nn |grep -i mass
SSD與數據庫優化
磁盤調度算法設置爲:deadline或者noop
InnoDB存儲引擎參數設置
innodb_flush_neighbors=0
innodb_log_file_size=4G
查看ssd
# cat /sys/block/sda/queue/rotational
1 --hdd,0--sdd
# grep ^ /sys/block/*/queue/rotational
#lsblk -d -o name,rota
----
一、使用SSD或者PCIe SSD設備,至少得到數百倍甚至萬倍的IOPS提高;
二、購置陣列卡同時配備CACHE及BBU模塊,可明顯提高IOPS(主要是指機械盤,SSD或PCIe SSD除外。同時須要按期檢查CACHE及BBU模塊的健康情況,確保意外時不至於丟失數據);
三、有陣列卡時,設置陣列寫策略爲WB,甚至FORCE WB(如有雙電保護,或對數據安全性要求不是特別高的話),嚴禁使用WT策略。而且閉陣列預讀策略,基本上是雞肋,用處不大;
四、儘量選用RAID-10,而非RAID-5;
五、使用機械盤的話,儘量選擇高轉速的,例如選用15KRPM,而不是7.2KRPM的盤,不差幾個錢的;
----
網卡優化
bond網卡
mode=0(balance-rr)(平衡輪循策略)
特色:傳輸數據包順序是依次傳輸(即:第1個包走eth0,下一個包就走eth1….一直循環下去,
直到最後一個傳輸完畢
mode=4(802.3ad)(IEEE 802.3ad 動態連接聚合)
[root@mysql1 ~]# ethtool eth0
確認有無加載bonding模塊
# lsmod | grep 'bonding'
# modprobe bonding
# lsmod | grep 'bonding'
配置bond0
1.CPU性能調優方法之一:把進程或線程綁定在單個CPU上,這能夠增長進程的CPU緩存溫度,提升它的內存I/O性能。
那麼如何配置一個進程只跑在單個CPU上?
# apt-get install schedutils
# taskset -cp 1,2,3 2345
# taskset -c 1,2,3 /etc/init.d/mysql start
--
使用taskset命令指定某pid使用的cpu
如ps -ef|grep mysqld 查找出mysql進程的pid
taskset -p pid 查看當前使用的是哪一個cpu
taskset -pc cpu'num pid 設置該進程使用哪一個cpu
--
2.描述基於Linux中可用內存即將耗盡內核時爲了釋放更多內存會採起的步驟。
# free -m
#cat /proc/sys/vm/drop_caches
#sync ##使用sync命令,將系統緩存區中的髒數據寫入磁盤中,包括已修改的i-node、已延遲的塊I/O和讀寫映射文件
#echo 3 > /proc/sys/vm/drop_caches
##配置文件/proc/sys/vm/drop_caches中記錄了緩存釋放的參數,含義:默認0—不釋放,1—釋放pagecache,2—釋放dentries和inodes,3—釋放全部緩存
釋放內存前先使用sync命令作同步,以確保文件系統的完整性,將全部未寫的系統緩衝區寫到磁盤中,
包含已修改的 i-node、已延遲的塊 I/O 和讀寫映射文件。不然在釋放緩存的過程當中,可能會丟失未保存的文件。
3.邏輯I/O和物理I/O有什麼區別?
隨機I/O和連續I/O有什麼區別?
物理io是從讀取文件,disk device,io channel,device driver
邏輯io是從讀取內存,vol mgnt,buffer cache,file system
邏輯IO是操做系統發起的IO,這個數據可能會放在磁盤上,也可能會放在內存(文件系統的Cache)裏。
物理IO是設備驅動發起的IO,這個數據最終會落在磁盤上。
邏輯IO和物理IO不是一一對應的。
隨機io就是隨機讀取磁盤
順序io就是順序的讀取磁盤
在隨機 I/O 環境中(如用於數據庫和通用文件服務器的環境),全部的磁盤都應花費相同的時間爲 I/O 請求提供服務
例如,假設有 40 GB 存儲用於數據庫應用程序。若是跨四個 10 GB 的磁盤軸進行條帶化,而且 I/O 是隨機且均勻地分
散於卷中,則每一個磁盤的繁忙程度同樣,通常狀況下會提升性能
磁盤上最大隨機 I/O 性能的目標是 35% 或更低的使用率(由 iostat 命令報告)。一般,磁盤使用率超過 65% 就會
出現問題。磁盤使用率超過 90% 就會出現嚴重問題。解決磁盤使用率值過高的辦法就是建立包含更多磁盤(軸)的新 RAID-0 卷。
能夠在順序 I/O 環境(如整表掃描佔支配地位的 DBMS 服務器,以及數據很是密集的環境中的 NFS 服務器)中優化配
置的性能。要充分利用順序 I/O 環境,請相對於通常 I/O 請求的大小將交錯值設置爲較小的值。
在順序 I/O 環境中,查找時間和旋轉時間實際上都爲零。優化順序 I/O 時,磁盤的內部傳輸率最爲重要
4.描述一個網絡接口工做超負荷會發生什麼,包括對應用程序性能的影響。
網絡接口超負荷,影響網絡傳輸,程序響應緩慢,可能會超時等。
[root@fcbu.com ~]# free -m
total used free shared buffers cached
Mem: 7979 7897 82 0 30 3918
-/ buffers/cache: 3948 4031
Swap: 4996 438 4558
第一行用全局角度描述系統使用的內存情況:
total 內存總數
used 已經使用的內存數,通常狀況這個值會比較大,由於這個值包括了cache 應用程序使用的內存
free 空閒的內存數
shared 多個進程共享的內存總額
buffers 緩存,主要用於目錄方面,inode值等(ls大目錄可看到這個值增長)
cached 緩存,用於已打開的文件
第二行描述應用程序的內存使用:
-buffers/cache 的內存數:used - buffers - cached
buffers/cache 的內存數:free buffers cached
前個值表示-buffers/cache 應用程序使用的內存大小,used減去緩存值
後個值表示 buffers/cache 全部可供應用程序使用的內存大小,free加上緩存值
第三行表示swap的使用:
used 已使用
free 未使用
可用的內存=free memory buffers cached。
爲何free這麼小,是否關閉應用後內存沒有釋放?
但實際上,咱們都知道這是由於Linux對內存的管理與Windows不一樣,free小並非說內存不夠用了,應該看的是free的
第二行最後一個值:-/ buffers/cache: 3948 4031 ,這纔是系統可用的內存大小。
實際項目中的經驗告訴咱們,若是由於是應用有像內存泄露、溢出的問題,從swap的使用狀況是能夠比較快速能夠判斷
的,但free上面反而比較難查看。我以爲既然核心是能夠快速清空buffer或cache,但核心並無這樣作(默認值是0),咱們不該該隨便去改變它。
通常狀況下,應用在系統上穩定運行了,free值也會保持在一個穩定值的,雖然看上去可能比較小。當發生內存不足、應用獲取不到可用內存、OOM錯 誤等問題時,仍是更應該去分析應用方面的緣由,如用戶量太大致使內存不足、發生應用內存溢出等狀況,不然,清空buffer,強制騰出free的大小,可 能只是把問題給暫時屏蔽了,因此說通常狀況下linux都不用常常手動釋放內存