■ 河南 劉建臣
在使用Linux時,必然要和系統(tǒng)內(nèi)核進行交互,在用戶和內(nèi)核之間其實是通過“/proc”這個虛擬文件系統(tǒng)進行聯(lián)系的。在其中提供了一些虛擬文件,當(dāng)用戶對其進行讀寫時,就可以與內(nèi)核進行交互。當(dāng)然,這些虛擬文件都是動態(tài)建立的。因為其活動在內(nèi)存中,因此如果使用普通的方法對其進行查看,是無法顯示其真實大小的。
例如在“/proc/sys/kernel”目錄中保存和內(nèi)核相關(guān)的參數(shù),例如在CentOS 7.X中執(zhí)行“echo “1” >/proc/sys/net/ipv4/ip_forward”命令,可以打開代理轉(zhuǎn)發(fā)功能。執(zhí)行“sysctl kernel.msgmnb”命令,可以顯示單個隊列中允許的最大字節(jié)長度。執(zhí)行“sysctl-w kernel.msgmnb=40960”命令,可以對該參數(shù)進行修改。但是,如果重啟系統(tǒng)后,進行的修改就會消失。為此可以執(zhí)行諸如“vim/etc/sysctl.conf”命令,在該文件中添加“sysctl kernel.msgmnb=40960”行,保存后執(zhí)行“sysctl -p”命令,可以讓修改操作立即生效。
執(zhí)行“echo 1 >/proc/sys/kernel/panic”命令,設(shè)置當(dāng)內(nèi)核出錯時,可以自動重啟。執(zhí)行“echo 196608>/proc/sys/kernel/pid_max”命令,可以設(shè)置進程數(shù)量最大值。執(zhí)行“echo 1>/proc/sys/kernel/ctrlalt-del”命令,可以禁止按下Ctrl+Alt+Delete組合鍵時系統(tǒng)重啟。執(zhí)行“echo"core.%e.%p " >/proc/sys/kernel/core_pattern”命令,設(shè)置Core文件保存位置信息。
在“/proc/sys/fs”目錄中保存和文件系統(tǒng)相關(guān)的參數(shù)。例如,執(zhí)行“echo"10485750">/proc/sys/fs/file-max”命令,可以設(shè)置分配的文件句柄的最大數(shù)目。執(zhí)行“echo "8192000">/proc/sys/fs/inotify/max_user_watches”命令,可以設(shè)置每個Real User ID可創(chuàng)建的inotify instatnces的數(shù)量上限。磁盤一般包括機械硬盤和固態(tài)硬盤,實際上,不管何種形式的磁盤,其隨機I/O的速度都要比順序I/O慢得多。
對于順序I/O來說,會采取預(yù)讀取的方式,來降低I/O請求次數(shù),進而優(yōu)化性能。在Linux中如果出現(xiàn)大量讀請求,默認的請求隊列因為長度不夠,可能無法應(yīng)對。為此可以動態(tài)調(diào)整請求隊列數(shù)來解決問題。
為了提高預(yù)讀取性能,可以對“/sys/block/sdb/queue/read_ahead_kb”參數(shù)進行適當(dāng)調(diào)整,其默認值為128字節(jié)。當(dāng)不同的進程在請求I/O資源時,系統(tǒng)就需要對其進行合理的調(diào)度。
對于Deadline調(diào)度算法來說,通過降低性能而獲得更短的等待時間,提供了最小的讀取延遲和較好的吞吐量,比較適用于數(shù)據(jù)庫服務(wù)器等讀取量較大的環(huán)境。對于固態(tài)磁盤,以及RAID磁盤陣列來說,比較適合使用電梯調(diào)度算法。
對于CFQ調(diào)度算法來說,使用了QoS策略為所有任務(wù)分配等量的帶寬,實現(xiàn)了較低的延遲,結(jié)合了以上兩個算法的優(yōu)點,對于多用戶環(huán)境比較適用??梢愿鶕?jù)實際情況,針對不同的磁盤設(shè)置合適的算法。例如執(zhí)行“echo'cfq'>/sys/block/sdb/queue/scheduler”命令,將指定的磁盤設(shè)定為CFQ調(diào)度算法。
對于固態(tài)硬盤來說,使用Trim技術(shù)可以大幅提高數(shù)據(jù)讀寫性能。例如,執(zhí)行“l(fā)sblk-D/dev/sdb”命令,可以檢測SSD磁盤是否支持Trim功能。如果在返回信息中的“DISC-GRAN”和“DISC-MAX”列中為非零值,說明其支持Trim功能。注意,只有Ext4和XFS格式支持Trim功能。
執(zhí)行“mount -t ext4-o discard/dev/sdb1/mnt”命令,可以在指定的分區(qū)上啟用Trim功能,還可以執(zhí)行“/usr/sbin/fstrim-a”命令,自動檢測硬盤是否支持TRIM功能,并在已掛載文件系統(tǒng)上執(zhí)行TRIM功能。
對于CentOS7.X中已經(jīng)使用了性能更加優(yōu)異的XFS文件系統(tǒng),在對磁盤進行格式化時,可以同步進行優(yōu)化操作。
在“/proc/sys/net”中保存和網(wǎng)絡(luò)相關(guān)的參數(shù),對于Web服務(wù)器來說,合理的配置這些參數(shù),對于有效的提高系統(tǒng)的性能。
例如,執(zhí)行“echo 2 >/proc/sys/net/ipv4/tcp_syn_retries”命令,可以設(shè)置當(dāng)內(nèi)核要2個SYN連接請求后才才放棄一個新建連接。執(zhí)行“echo 300>/proc/sys/net/ipv4/tcp_keepalive_time”命令,可以設(shè)置TCP發(fā)送keepalive消息的頻度。執(zhí)行“echo 1 >/proc/sys/net/ipv4/tcp_orphan_retries”命令,可以重試后放棄Socket連接。
執(zhí)行“echo 1 >/proc/s ys/net/ipv4/ tcp_syncook ies”命令,可以啟用SYN Cookies功能,可以有效防御SYN攻擊。執(zhí)行“echo 8192>/proc/sys/net/ipv4/tcp_max_syn_backlog”命令,將SYN隊列長度設(shè)置為8192,可以接受更多的網(wǎng)絡(luò)連接。
執(zhí)行“echo 2 >//proc/sys/net/ipv4/tcp_synack_retries”命令,將SYN+ACK報文重試次數(shù)設(shè)置為2。
執(zhí)行“echo 1 >/proc/sys/net/ipv4/ tcp_tw_recycle”命令,啟用TCP連接中TIME-WAIT Sockets快速回收功能。
執(zhí)行“netstat -n | aw k '/^tcp/ {++state[$NF]};END {for(key in state) p rint key," ",state[key]}'”,“netstat -n | awk'/^tcp/ {++arr[$NF]};END{for(k in arr) print k," ",arr[k]}'”等命令,可以查看系統(tǒng)的TIME-WAIT狀態(tài)信息。
執(zhí)行“echo 1 >/proc/sys/net/ipv4/tcp_tw_reuse”命令,可以允許將TIME-WAIT sockets重新用于新的TCP連接。當(dāng)然,這必須同時開啟TIME-WAIT Sockets快速回收功能。
執(zhí)行“cho 15 >/proc/sys/net/ipv4/tcp_fin_timeout”命令,設(shè)置處于TIME_WAIT狀態(tài)的連接在回收前必須等待的最小時間。執(zhí)行“echo 5>/proc/sys/net/ipv4/ tcp_keepalive_probes”命令,設(shè)置超時前的等待次數(shù)。
執(zhí)行“echo 3000>/pro c/sys/net/ipv4/ netdev_max_backlog”命令,設(shè)置每個網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率大于內(nèi)核處理這些包的速率快時,允許送到隊列的數(shù)據(jù)包的最大數(shù)目。執(zhí)行“echo 16777216>/proc/sys/net/core/rmem_max”,“echo 16777216>/proc/sys/net/core/wmem_max”命令,設(shè)置接收/發(fā)送套接字緩沖區(qū)大小的最大值,單位為字節(jié)。
執(zhí)行“echo "4096 87380 16777216">/proc/sys/net/ipv4/tcp_rmem”,“echo"4096 65536 16777216">/proc/sys/net/ipv4/tcp_rmem”命令,分別設(shè)置內(nèi)核自動對Socket緩沖區(qū)進行讀取/寫入的最小值,默認值和最大值。執(zhí)行“echo 4096 >/proc/sys/net/core/somaxconn”命令,可以設(shè)置Socket監(jiān)聽的隊列上限。
對內(nèi)存設(shè)置進行優(yōu)化,必須搞清楚Buffer(緩沖)和Cache(緩存)的關(guān)系。Cached工作在CPU與內(nèi)存之間的層面,經(jīng)常被應(yīng)用到磁盤I/O請求上。Buffer工作在內(nèi)存與磁盤之間的層面。Cache將CPU讀取過的數(shù)據(jù)保存起來,便于CPU下次需要時快速讀取,而不必重復(fù)從磁盤中讀取這些數(shù)據(jù)。如果Cache中沒有搜索到數(shù)據(jù),系統(tǒng)才會從磁盤中讀取。而且系統(tǒng)會根據(jù)CPU讀取的頻率,將最頻繁的數(shù)據(jù)存放到Cache中最容易找到的位置。
對于Buffer來說,存儲的是需要寫入磁盤的數(shù)據(jù)。Buffe是針對不同的進程進行分配的。在Linux中Cache的讀寫是分別進行的。
一方面磁盤數(shù)據(jù)會被讀取到Page Cache進行緩存,程序要會從中直接讀取數(shù)據(jù)讀取數(shù)據(jù)。
另一方面當(dāng)刷新Page Cache的數(shù)據(jù)時,Page Cache會將其提交給Buffer Cache,由其將所有數(shù)據(jù)定期寫入到磁盤中。對于Page Cache來說,是文件系統(tǒng)層級的緩存。對于Buffer Cache來說,是用于磁盤等塊設(shè)備的緩沖。
例如,執(zhí)行Sync命令,可以手工將Buffer Cache的數(shù)據(jù)寫入磁盤。當(dāng)讀取文件時,系統(tǒng)會首先在Page Cache中查找,當(dāng)執(zhí)行時系統(tǒng)只是將數(shù)據(jù)暫寫入Page Cache中,并將該頁置上dirty標志,這些數(shù)據(jù)會被定期批量保存到文件系統(tǒng)中。
在“/proc/sys/vm”目錄中保存和內(nèi)存設(shè)置相關(guān)的參數(shù),對于Page Cache進行優(yōu)化,主要包含“vm.dirty_background_ratio”和“vm.dirty_ratio”參數(shù)。
例如,執(zhí)行“echo 5>/proc/sys/vm/dirty_background_ratio”命令,設(shè)置當(dāng)文件系統(tǒng)緩存臟數(shù)據(jù)數(shù)量達到系統(tǒng)內(nèi)存5%時,就會觸發(fā)Pdflush等后臺回寫進程運行。
執(zhí)行“echo 10 >/proc/sys/vm/dirty_ratio”命令,設(shè)置當(dāng)文件系統(tǒng)緩存臟數(shù)據(jù)數(shù)量達到系統(tǒng)內(nèi)存10%時,必須開始處理緩存臟頁,其要大于或者等于前者的數(shù)值,因為此時臟頁數(shù)量已經(jīng)比較多,為了避免數(shù)據(jù)丟失需要將一定臟頁寫入磁盤。
如果需要立即回收Cache,可以執(zhí)行“echo 1 >/proc/sys/vm/drop_caches”命令,釋放Page Cache。
執(zhí)行“sync”命令,將緩存寫入磁盤。執(zhí)行“echo 3>/proc/sys/vm/drop_cache s”命令,可以釋放文件節(jié)點緩存和目錄項緩存。
執(zhí)行“echo 3 >/proc/sys/vm/drop_caches”命令,可以釋放以上所有緩存項目。在“/proc/sys/vm/dirty_expire_centisecs”參數(shù)中設(shè)置臟數(shù)據(jù)在內(nèi)存中駐留時間,如果超過超過該值的話,Pdflush進程在下一次將把這些數(shù)據(jù)寫回磁盤。在“/proc/sys/vm/dirty_writeback_centisecs”參數(shù)中設(shè)置新進程pdflush的運行間隔,該進程用于刷新內(nèi)核的臟數(shù)據(jù)。
在“/proc/sys/vm/vfs_cache_pressure”參數(shù)中內(nèi)核回收用于directory和inode cache內(nèi)存的傾向。在“/proc/sys/vm/min_free_kbytes”參數(shù)中設(shè)置強制Linux VM最低保留多少空閑內(nèi)存。
在“/proc/sys/vm/over commit_memory”參數(shù)中設(shè)置內(nèi)存分配策略,如果為0表示當(dāng)應(yīng)用程序申請內(nèi)存時,如果有足夠的可用內(nèi)存則申請允許,否則內(nèi)存申請失敗,并把錯誤返回給應(yīng)用進程。如果為1表示內(nèi)核允許分配所有的物理內(nèi)存,如果為2表示內(nèi)核允許分配超過所有物理內(nèi)存和交換空間總和的內(nèi)存。
在“/proc/sys/vm/panic_on_oom”參數(shù)的值如果為0,表示當(dāng)內(nèi)存耗盡時內(nèi)核會觸發(fā)OOM killer清除最耗內(nèi)存的進程。
如果設(shè)置為1表示在OOM時系統(tǒng)會Panic。使用交換分區(qū),可以緩解內(nèi)存不足的問題。