/etc/sysctl.conf 調優 & 優化Linux內核參數
from: http://apps.hi.baidu.com/share/detail/15652067
http://keyknight.blog.163.com/blog/static/3663784020104152407759/
http://blog.sina.com.cn/s/blog_6e2aeba30100uve3.html
http://www.cnblogs.com/MYSQLZOUQI/p/5175432.html-----優化Linux內核參數/etc/sysctl.conf sysctl 《高性能Linux服務器構建實戰:運維監控、性能調優與集群應用》
sysctl.conf 優化
The sysctl.conf of a server is something that is seldom optimized for performance. You can get a tremendous boost in throughput by adjusting these settings. This configuration has been written by Steve from Rack911. I have applied this configuration to servers ranging from Celeron 1.7Ghz to Dual Xeon 2.8Ghz servers, and on the whole, the load on each lowered after making the changes.
First make a backup of your old /etc/sysctl.conf file by running the following command, logged in as root:
cp /etc/sysctl.conf /etc/sysctl.conf.bak
Now enter:
pico /etc/sysctl.conf
and replace the contents of the file with the following:
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Disables packet forwarding
net.ipv4.ip_forward=0
# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Enable IP spoofing protection, turn on source route verification
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.lo.log_martians = 0
net.ipv4.conf.eth0.log_martians = 0
# Disables the magic-sysrq key
kernel.sysrq = 0
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 15
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# Turn off the tcp_window_scaling
net.ipv4.tcp_window_scaling = 0
# Turn off the tcp_sack
net.ipv4.tcp_sack = 0
# Turn off the tcp_timestamps
net.ipv4.tcp_timestamps = 0
# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1
# Enable ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1
# Increases the size of the socket queue (effectively, q0).
net.ipv4.tcp_max_syn_backlog = 1024
# Increase the tcp-time-wait buckets pool size
net.ipv4.tcp_max_tw_buckets = 1440000
# Allowed local port range
net.ipv4.ip_local_port_range = 16384 65536
CTRL + X to exit and save the file
To make your changes take effect immediately, type this command:
/sbin/sysctl -p
引用自:FreeBSD下構建安全的Web服務器
作者:heiyeluren http://www.unixsky.net
編輯 /etc/sysctl.conf 文件,在里面加入如下內容:(有注釋)
#最大的待發送TCP數據緩沖區空間
net.inet.tcp.sendspace=65536
#最大的接受TCP緩沖區空間
net.inet.tcp.recvspace=65536
#最大的接受UDP緩沖區大小
net.inet.udp.sendspace=65535
#最大的發送UDP數據緩沖區大小
net.inet.udp.maxdgram=65535
#本地套接字連接的數據發送空間
net.local.stream.sendspace=65535
#加快網絡性能的協議
net.inet.tcp.rfc1323=1
net.inet.tcp.rfc1644=1
net.inet.tcp.rfc3042=1
net.inet.tcp.rfc3390=1
#最大的套接字緩沖區
kern.ipc.maxsockbuf=2097152
#系統中允許的最多文件數量
kern.maxfiles=65536
#每個進程能夠同時打開的最大文件數量
kern.maxfilesperproc=32768
#當一台計算機發起TCP連接請求時,系統會回應ACK應答數據包。該選項設置是否延遲ACK應答數據包,把它和包含數據的數據包一起發送,在高速網絡和低負載的情況下會略微提高性能,但在網絡連接較差的時候,對方計算機得不到應答會持續發起連接請求,反而會降低性能。
net.inet.tcp.delayed_ack=0
#屏蔽ICMP重定向功能
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=1
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0
#防止ICMP廣播風暴
net.inet.icmp.bmcastecho=0
net.inet.icmp.maskrepl=0
#限制系統發送ICMP速率
net.inet.icmp.icmplim=100
#安全參數,編譯內核的時候加了options TCP_DROP_SYNFIN才可以用
net.inet.icmp.icmplim_output=0
net.inet.tcp.drop_synfin=1
#設置為1會幫助系統清除沒有正常斷開的TCP連接,這增加了一些網絡帶寬的使用,但是一些死掉的連接最終能被識別並清除。死的TCP連接是被撥號用戶存取的系統的一個特別的問題,因為用戶經常斷開modem而不正確的關閉活動的連接
net.inet.tcp.always_keepalive=1
#若看到net.inet.ip.intr_queue_drops這個在增加,就要調大net.inet.ip.intr_queue_maxlen,為0最好
net.inet.ip.intr_queue_maxlen=1000
#防止DOS攻擊,默認為30000
net.inet.tcp.msl=7500
#接收到一個已經關閉的端口發來的所有包,直接drop,如果設置為1則是只針對TCP包
net.inet.tcp.blackhole=2
#接收到一個已經關閉的端口發來的所有UDP包直接drop
net.inet.udp.blackhole=1
#為網絡數據連接時提供緩沖
net.inet.tcp.inflight.enable=1
#如果打開的話每個目標地址一次轉發成功以后它的數據都將被記錄進路由表和arp數據表,節約路由的計算時間,但會需要大量的內核內存空間來保存路由表
net.inet.ip.fastforwarding=0
#kernel編譯打開options POLLING功能,高負載情況下使用低負載不推薦SMP不能和polling一起用
#kern.polling.enable=1
#並發連接數,默認為128,推薦在1024-4096之間,數字越大占用內存也越大
kern.ipc.somaxconn=32768
#禁止用戶查看其他用戶的進程
security.bsd.see_other_uids=0
#設置kernel安全級別
kern.securelevel=0
#記錄下任何TCP連接
net.inet.tcp.log_in_vain=1
#記錄下任何UDP連接
net.inet.udp.log_in_vain=1
#防止不正確的udp包的攻擊
net.inet.udp.checksum=1
#防止DOS攻擊
net.inet.tcp.syncookies=1
#僅為線程提供物理內存支持,需要256兆以上內存
kern.ipc.shm_use_phys=1
# 線程可使用的最大共享內存
kern.ipc.shmmax=67108864
# 最大線程數量
kern.ipc.shmall=32768
# 程序崩潰時不記錄
kern.coredump=0
# lo本地數據流接收和發送空間
net.local.stream.recvspace=65536
net.local.dgram.maxdgram=16384
net.local.dgram.recvspace=65536
# 數據包數據段大小,ADSL為1452。
net.inet.tcp.mssdflt=1460
# 為網絡數據連接時提供緩沖
net.inet.tcp.inflight_enable=1
# 數據包數據段最小值,ADSL為1452
net.inet.tcp.minmss=1460
# 本地數據最大數量
net.inet.raw.maxdgram=65536
# 本地數據流接收空間
net.inet.raw.recvspace=65536
#ipfw防火牆動態規則數量,默認為4096,增大該值可以防止某些病毒發送大量TCP連接,導致不能建立正常連接
net.inet.ip.fw.dyn_max=65535
#設置ipf防火牆TCP連接空閑保留時間,默認8640000(120小時)
net.inet.ipf.fr_tcpidletimeout=864000
Linux如何在系統運行時修改內核參數(/proc/sys 與 /etc/sysctl.conf)
RedHat向員提供了非常好的方法,使我們可以在系統運行時更改內核參數,而不需要重新引導系統。這是通過/proc虛擬文件系統實現的。/proc/sys目錄下存放着大多數的內核參數,並且設計成可以在系統運行的同時進行更改, 不過重新啟動機器后會失效,可以通過更改/proc/sys中內核參數對應的文件 /etc/sysctl.conf 的內核參數來永久更改。下面我們以打開內核的 ip轉發功能為例說明在系統運行時修改內核參數的兩種方法。IP轉發是指允許系統對來源和目的地都不是本機的數據包通過網絡,RedHat默認屏蔽此功能,在 需要用本機作為路由器、NAT等情況下需要開啟此功能。
方法一:修改/proc下內核參數文件內容
直接修改內核參數ip_forward對應在/proc下的文件/proc/sys/net/ipv4/ip_forward。用下面命令查看ip_forward文件內容:
# cat /proc/sys/net/ipv4/ip_forward
該文件默認值0是禁止ip轉發,修改為1即開啟ip轉發功能。修改命令如下:
# echo 1 >/proc/sys/net/ipv4/ip_forward
修改過后就馬上生效,即內核已經打開ip轉發功能。但如果系統重啟后則又恢復為默認值0,如果想永久打開需要通過修改/etc/sysctl.conf文件的內容來實現。
方法二.修改/etc/sysctl.conf文件
默認sysctl.conf文件中有一個變量是
net.ipv4.ip_forward = 0
將后面值改為1,然后保存文件。因為每次系統啟動時初始化腳本/etc/rc.d/rc.sysinit會讀取/etc/sysctl.conf文件的內容,所以修改后每次系統啟動時都會開啟ip轉發功能。但只是修改sysctl文件不會馬上生效,如果想使修改馬上生效可以執行下面的命令:
# sysctl –p
在修改其他內核參數時可以向/etc/sysctl.conf文件中添加相應變量即可,下面介紹/proc/sys下內核文件與配置文件 sysctl.conf中變量的對應關系,由於可以修改的內核參數都在/proc/sys目錄下,所以sysctl.conf的變量名省略了目錄的前面部分(/proc/sys)。
將/proc/sys中的文件轉換成sysctl中的變量依據下面兩個簡單的規則:
1.去掉前面部分/proc/sys
2.將文件名中的斜杠變為點
這兩條規則可以將/proc/sys中的任一文件名轉換成sysctl中的變量名。
例如:
/proc/sys/net/ipv4/ip_forward =》 net.ipv4.ip_forward
/proc/sys/kernel/hostname =》 kernel.hostname
可以使用下面命令查詢所有可修改的變量名
# sysctl –a
下面例舉幾個簡單的內核參數:
1./proc/sys/kernel/shmmax
該文件指定內核所允許的最大共享內存段的大小。
2./proc/sys/kernel/threads-max
該文件指定內核所能使用的線程的最大數目。
3./proc/sys/kernel/hostname
該文件允許您配置網絡主機名。
4./proc/sys/kernel/domainname
該文件允許您配置網絡域名
1、net.ipv4.tcp_max_syn_backlog = 65536
記錄的那些尚未收到客戶端確認信息的連接請求的最大值。對於超過128M內存的系統而言,缺省值是1024,低於128M小內存的系統則是128。
SYN Flood攻擊利用TCP協議散布握手的缺陷,偽造虛假源IP地址發送大量TCP-SYN半打開連接到目標系統,最終導致目標系統Socket隊列資源耗盡而無法接受新的連接。為了應付這種攻擊,現代Unix系統中普遍采用多連接隊列處理的方式來緩沖(而不是解決)這種攻擊,是用一個基本隊列處理正常的完全連接應用(Connect()和Accept() ),是用另一個隊列單獨存放半打開連接。
這種雙隊列處理方式和其他一些系統內核措施(例如Syn-Cookies/Caches)聯合應用時,能夠比較有效的緩解小規模的SYN Flood攻擊(事實證明<1000p/s)加大SYN隊列長度可以容納更多等待連接的網絡連接數,一般遭受SYN Flood攻擊的網站,都存在大量SYN_RECV狀態,所以調大tcp_max_syn_backlog值能增加抵抗syn攻擊的能力。
2、net.core.netdev_max_backlog = 32768
每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
3、net.core.somaxconn = 32768
調整系統同時發起並發TCP連接數,可能需要提高連接儲備值,以應對大量突發入局連接請求的情況。如果同時接收到大量連接請求,使用較大的值會提高受支持的暫掛連接的數量,從而可減少連接失敗的數量。大的偵聽隊列對防止DDoS攻擊也會有所幫助。掛起請求的最大數量默認是128。
4、net.core.wmem_default = 8388608
該參數指定了發送套接字緩沖區大小的缺省值(以字節為單位)
5、net.core.rmem_default = 8388608
該參數指定了接收套接字緩沖區大小的缺省值(以字節為單位)
6、net.core.rmem_max = 16777216
該參數指定了接收套接字緩沖區大小的最大值(以字節為單位)
7、net.core.wmem_max = 16777216
該參數指定了發送套接字緩沖區大小的最大值(以字節為單位)
8、net.ipv4.tcp_timestamps = 0
Timestamps可以防范那些偽造的sequence號碼。一條1G的寬帶線路或許會重遇到帶out-of-line數值的舊sequence號碼(假如它是由於上次產生的)。時間戳能夠讓內核接受這種“異常”的數據包。這里需要將其關掉,以提高性能。
9、net.ipv4.tcp_synack_retries = 2
對於遠端的連接請求SYN,內核會發送SYN+ACK數據報,以確認收到上一個SYN連接請求包。這是所謂的三次握手(threeway handshake)機制的第二個步驟。這里決定內核在放棄連接之前所送出的SYN+ACK數目。不應該大於255,默認值是5,對應於180秒左右時間。(可以根據tcp_syn_retries來決定這個值)
10、net.ipv4.tcp_syn_retries = 2
對於一個新建連接,內核要發送多少個SYN連接請求才決定放棄。不應該大於255,默認值是5,對應於180秒左右時間。(對於大負載而物理通信良好的網絡而言,這個值偏高,可修改為2.這個值僅僅是針對對外的連接,對進來的連接,是由tcp_retries1 決定的)
11、net.ipv4.tcp_tw_recycle = 1
表示開啟TCP連接中TIME-WAIT Sockets的快速回收,默認為0,表示關閉。
#net.ipv4.tcp_tw_len = 1
12、net.ipv4.tcp_tw_reuse = 1
表示開啟重用,允許將TIME-WAIT Sockets重新用於新的TCP連接,默認為0,表示關閉。這個對快速重啟動某些服務,而啟動后提示端口已經被使用的情形非常有幫助。
13、net.ipv4.tcp_mem = 94500000 915000000 927000000
tcp_mem有3個INTEGER變量:low, pressure, high
low:當TCP使用了低於該值的內存頁面數時,TCP沒有內存壓力,TCP不會考慮釋放內存。(理想情況下,這個值應與指定給tcp_wmem的第2個值相匹配。這第2個值表明,最大頁面大小乘以最大並發請求數除以頁大小 (131072*300/4096)
pressure:當TCP使用了超過該值的內存頁面數量時,TCP試圖穩定其內存使用,進入pressure模式,當內存消耗低於low值時則退出pressure狀態。(理想情況下這個值應該是TCP可以使用的總緩沖區大小的最大值(204800*300/4096)
high:允許所有TCP Sockets用於排隊緩沖數據報的頁面量。如果超過這個值,TCP連接將被拒絕,這就是為什么不要令其過於保守(512000*300/4096)的原因了。在這種情況下,提供的價值很大,它能處理很多連接,是所預期的2.5倍;或者使現有連接能夠傳輸2.5倍的數據。
一般情況下這些值是在系統啟動時根據系統內存數量計算得到的。
14、net.ipv4.tcp_max_orphans = 3276800
系統所能處理不屬於任何進程的TCP sockets最大數量。假如超過這個數量﹐那么不屬於任何進程的連接會被立即reset,並同時顯示警告信息。之所以要設定這個限制﹐純粹為了抵御那些簡單的DoS攻擊﹐千萬不要依賴這個或是人為的降低這個限制
#net.ipv4.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
15、net.ipv4.ip_local_port_range = 1024 65535
將系統對本地端口范圍限制設置為1024~65000之間
16、net.ipv4.ip_conntrack_max = 10000
設置系統對最大跟蹤的TCP連接數的限制(CentOS 5.6無此參數)