CPU mysql
進程綁定CPU tastset linux
調整進程優先級 nice renice ios
內存 算法
swap sql
swappiness 使用swap的傾向性 0-100 內存足夠大 能夠調整10 後端
系統默認 使用的頁表佔內存的%+swappiness%>=100 開始使用swap 緩存
cat /proc/sys/vm/swappiness 安全
臨時性修改 sysctl vm.swappiness=10 服務器
永久修改 Vim /etc/sysctl.conf 最後一行添加 vm.swappiness=10 cookie
msgmax
以字節爲單位規定信息隊列中任意信息的最大容許大小。這個值必定不能超過該隊列的大小
(msgmnb)。默認值爲 65536。
msgmnb
以字節爲單位規定單一信息隊列的最大值。默認爲 65536 字節。
msgmni
規定信息隊列識別符的最大數量(以及隊列的最大數量)。64 位架構機器的默認值爲 1985;32
位架構機器的默認值爲 1736。
shmall
以字節爲單位規定一次在該系統中可使用的共享內存總量。64 位架構機器的默認值爲
4 294 967296;32 位架構機器的默認值爲 2684 354 56。
shmmax
以字節爲單位規定內核可容許的最大共享內存片斷。64 位架構機器的默認值爲 687194 76736;
32 位架構機器的默認值爲 4 294 967295。注:但內核支持的值比這個值要多得多。
shmmni
規定系統範圍內最大共享內存片斷。在 64 位和 32 位架構機器中的默認值都是 4 096。
dirty_ratio
規定百分比值。當髒數據組成達到系統內存總數的這個百分比值後開始寫下髒數據(pdflush)。
默認值爲 20。
dirty_background_ratio
規定百分比值。當髒數據組成達到系統內存總數的這個百分比值後開始在後端寫下髒數據
(pdflush)。默認值爲 10。
磁盤i/o
queue length
/sys/block/<dev>/queue/nr_requests
I/O 調度程序
調整i/o調度算法
cd /sys/block/sda/queue
echo cfq > scheduler
寫到 /etc/init.d/rc.local
參數
/sys/block/device/queue/iosched/
徹底公平調度(CFQ)
fifo_expire_async
這個可調參數控制異步(緩存寫入)請求等待的時間長度。過時後(以毫秒計)會將沒法知足的異
步請求移動到調度表中。默認爲 250 毫秒。
fifo_expire_sync
這個參數與 fifo_expire_async 相同,用於同步請求(讀取和 O_DIRECT 寫入)。默認爲 125 毫
秒。
最後期限 I/O 調度程序
read_expire
這個可調參數可以讓您已毫秒爲單位設定讀取操做速度。默認將其設定爲 500 毫秒(即半秒)。
write_expire
這個可調參數可以讓您已毫秒爲單位設定寫入操做速度。默認將其設定爲 5000 毫秒(即五秒)。
writes_starved
這個可調參數控制處理單一寫入批以前能夠處理多少讀取批。這個值越高,越傾向於讀取操做。
Noop
Noop I/O 調度程序採用先入先出(FIFO)調度算法。合併原始塊層中的請求,但只是一個最後命中緩存
(last-hit cache)。若是系統與 CPU 捆綁,且使用高速存儲,這就是可使用的最佳 I/O 調度程序。
文件系統
磁盤的碎片情況 dumpe2fs
mount –o noatime
ext3 支持三種日誌模式,劃分的依據是選擇元數據塊仍是數據塊寫入日誌,以及什麼時候寫入日誌。
1. 日誌模式(Journal):文件系統全部數據和元數據的改變都被記入日誌。這種模式減小了丟失每一個文件的機會,但須要不少額外的磁盤訪問。例如:當一個新文件被建立時,它的全部數據塊都必須複製一份做爲日誌記錄。這是最安全但最慢的日誌模式。
2. 預約模式(Ordered):只對文件系統元數據塊的改變才記入日誌,這樣能夠確保文件系統的一致性,可是不能保證文件內容的一致性。然而,ext3文件系統把元數據塊和相關的數據塊進行分組,以便在元數據塊寫入日誌以前寫入數據塊。這樣,就能夠減小文件內數據損壞的機會;例如,確保增大文件的任何寫訪問都徹底受日誌的保護。這是缺省的 ext3 日誌模式。
3. 寫回(Writeback):只有對文件系統元數據的改變才被記入日誌,對文件數據的更新與元數據記錄能夠不一樣步(相對Ordered模式而言),即ext3是支持異步的日誌。
-o data= journal ordered writeback
文件系統塊大小
ext4
Barriers
寫入 barrier 是保證在永久存儲中正確寫入並排列文件系統元數據的內核機制,即便在存儲設備會常常斷電
的狀況也不例外。啓用了寫入 barrier 的文件系統還能夠保證在斷電時保存使用 fsync() 進行的全部數據傳
輸。紅帽企業版 Linux 默認在全部支持此功能的硬件上啓用 barrier。
但啓用寫入 barrier 可顯著延緩一些程序的速度,特別是使用不少 fsync() 的程序,或者延緩建立和刪除大
量小文件的速度。對於沒有不穩定寫入緩存的存儲,或者罕見的文件系統不一致的狀況以及斷電後出現能夠
承受的數據丟失,可以使用 nobarrier 掛載選項禁用 barrier
訪問時間(noatime)
增長的預讀支持
blockdev 命令查看並編輯預讀值
# blockdev -getra device
要修改那個塊設備的預讀值,請運行如下命令。N 表明 512 字節扇區中的數值。
# blockdev -setra N device
注:使用 blockdev 命令選擇的值重啓後不會保留。咱們建議建立一個運行等級 init.d 腳本在引導時設
定這個值。
mysql 數據文件在XFS文件系統上性能優於EXT4
測試工具
ioZeno
aio-stress
blktrace blkparse seekwatcher
網絡系統
接收隊列 發送隊列 都是一段內存空間
核心緩衝
TCP緩衝
一段內存空間 在linux 一個socket文件
netstat –tunlp
sar –n SOCK
totsck
Total number of sockets used by the system.
tcpsck
Number of TCP sockets currently in use.
udpsck
Number of UDP sockets currently in use.
rawsck
Number of RAW sockets currently in use.
ip-frag
Number of IP fragments currently in use.
tcp-tw
Number of TCP sockets in TIME_WAIT state.
lsof
netstat –an | awk ‘/^tcp/{s[$NF}++}END { for (i in s) print i,s[i]}’
dstat
網絡優化參數:
net.ipv4.tcp_max_tw_buckets
timewait的數量,默認爲8192;
net.ipv4.ip_local_port_range = 1024 65000
容許系統打開的端口範圍,前而爲下限,後面的數字爲上限;默認爲「32768 61000」;
注意:此可用範圍決定了最後timewait狀態的鏈接的數量;下面的兩項可有效下降tw狀態鏈接的數量;
net.ipv4.tcp_tw_recycle = {0|1}
是否啓用timewait快速回收;注意:開啓此功能在NAT環境下可能會出現嚴重的問題:由於TCP有一種行爲,它能夠緩存每一個鏈接最新的時間戳,後續請求中若是時間戳小於緩存中的時間戳,即被視爲無效並丟棄相應的請求報文;Linux是否啓用這種行爲取決於tcp_timestamp和tcp_tw_recycle,而前一個參數默認是啓用的,因此啓用後面的參數就會激活此功能;
所以,若是是NAT環境,安全起見,應該禁用tcp_tw_recycle。另外一種解決方案:把tcp_timestamps設置爲0,tcp_tw_recycle設置爲1並不會如想象中奏效,由於一旦關閉了tcp_timestamps,那麼即使打開了tcp_tw_recycle,後面的參數也沒有效果。此時下降net.ipv4.tcp_max_tw_buckets的值就能夠顯著下降tw鏈接的數量了。
net.ipv4.tcp_tw_reuse = {0|1}
是否開啓tw重用,便是否容許將TIME-WAIT sockets 用於新的TCP鏈接;
net.ipv4.tcp_syncookies = {0|1}
是否開啓SYN Cookies,即當SYN等待隊列溢出時,是否啓用cookies功能;
net.ipv4.tcp_timestamps = 0
tcp報文時間戳,關閉時能夠避免序列號的卷繞,如上所述;
net.ipv4.tcp_max_syn_backlog = 262144
保存的那些還沒有收到客戶端確認信息的鏈接請求的最大值;默認爲128,可增大此值;
net.ipv4.tcp_synack_retries = #
爲了打開對端的鏈接,內核須要發送一個SYN並附帶一個迴應前面一個SYN的ACK,這也即所謂的三次握手中的第二次;這個設置決定了內核放棄鏈接以前發送SYN+ACK 包的數量;繁忙的服務器上建議設置爲0或者1;
net.ipv4.tcp_syn_retries = #
在內核放棄創建鏈接以前發送SYN包的數量;繁忙的服務器上建議設置爲0或者1;
net.ipv4.tcp_max_orphans = 262144
系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上;若是超過這個數字,孤兒鏈接將即刻被複位並打印出警告信息;
這個限制僅僅是爲了防止簡單的DoS ***,不能過度依靠它或者人爲地減少這個值,若是須要修改,在確保有足夠內存可用的前提下,應該增大此值;
net.ipv4.tcp_fin_timeout = 5
若是套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間;缺省值是60秒。
然而,對端可能會出錯或意外宕機並永遠不關閉鏈接。即便你的機器是一個輕載的WEB 服務器,也有由於大量的死套接字而內存溢出的風險,FIN-WAIT-2 的危險性比FIN-WAIT-1要小,由於每一個鏈接最多隻能消耗1.5K內存,可是它們的生存期長些;
net.ipv4.tcp_keepalive_time = 30
當keepalive起用的時候,TCP發送keepalive消息的頻度,默認是是2小時;
net.core.rmem_max=8388608
定義內核用於全部類型的鏈接的最大接收緩衝大小;
net.core.rmem_default=65536
定義內核用於全部類型的鏈接的默認接收緩衝大小;
net.core.wmem_max=8388608
定義內核用於全部類型的鏈接的最大發送緩衝大小;
net.core.wmem_default=65536
定義內核用於全部類型的鏈接的默認發送緩衝大小;
net.ipv4.tcp_mem='8388608 8388608 8388608'
定義TCP協議棧使用的內存空間;分別爲最小值,默認值和最大值;
net.ipv4.tcp_rmem='4096 87380 8388608'
定義TCP協議棧用於接收緩衝的內存空間;第一個值爲最小值,即使當前主機內存空間吃緊,也得保證tcp協議棧至少有此大小的空間可用;第二個值爲默認值,它會覆蓋net.core.rmem_default中爲全部協議定義的接收緩衝的大小;第三值爲最大值,即能用於tcp接收緩衝的最大內存空間;
net.ipv4.tcp_wmem='4096 65536 8388608'
定義TCP協議棧用於發送緩衝的內存空間;
國內著名電商某服務器的內核優化參數:
# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536
# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536
# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736
# Controls the maximum number of shared memory segments, in pages kernel.shmall = 4294967296 net.core.somaxconn = 32768 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_syn_retries = 0 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_keepalive_time = 100 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 200