【轉】轉 Linux調優方案,sysctl.conf的設置

 
http://blog.sina.com.cn/s/blog_541086000100skq0.html proc/sys/net/ipv4/下各項的意義
http://blog.chinaunix.net/space.php?uid=20423817&do=blog&id=1682374 網站加速:服務器篇 一些實用tips的整理

http://bbs.chinaunix.net/thread-2318039-1-1.html
問題表現就是epoll這個服務端對10000的併發請求處理特別慢,甚至還出現不少客戶鏈接超時的狀況!可是順序的一個個請求卻沒有問題。

測試以下:
首先是1個進程,順序10000個請求。服務端沒問題,很快速完成。

而後是10000個進程,每一個進程1個請求,開始都還正常,但是過一會服務端accept就阻塞了,大概有1-2s,以後又返回,有時候還會出現客戶端鏈接超時的問題,可是這樣測30章那個線程池(300個線程)的服務端代碼,無論怎麼測都不會有問題。

按理說accept應該能一直返回纔對呀,爲何中途會阻塞呢?是內核參數問題?
以前也試過把listenfd也添加到epoll裏,listenfd不是ET模式。也有這樣的問題。

分析了不少可能:
?        epoll自己處理效率的問題(這個本身都不信)
?        服務端完成客戶的處理請求太耗時,致使沒有時間讓accept返回其餘客戶鏈接(這是個最簡單的處理,應該也不會)
?        單臺機器測試,因此產生了太多的TIME_WAIT致使客戶沒法鏈接致使超時(以前覺得是這個緣由)
?        內核的一些限制問題,服務端不能同時處理太多鏈接(可能的緣由)

最終才發現真正緣由!!!
原來上面這個服務器代碼listen指定的backlog鏈接完成隊列參數過小,只有32,致使高併發的時候,服務器的鏈接完成隊列在極短的時間內被填滿 了,而accept的處理速度跟不上隊列填滿的速度,致使隊列始終是滿的,而後就不理會客戶的其餘鏈接請求,致使了客戶connect超時,而且處理效率 低下。
而線程池的backlog有1024,不過受限於內核參數的默認值最大128,因此線程池這個的backlog實際是128(見man listen),再加上300個線程,每一個線程獨自accpet,因此能很快從完成隊列中取得鏈接,客戶的connect也不會超時了,若是把線程數改成 1個,客戶鏈接也會超時。

詳細信息能夠man listen  同時man tcp 裏面有不少限制對服務器來講須要改的。

通常設置:
1 #sudo vi /etc/sysctl.conf 
#在最後面編輯添加如下內容: 

#缺省socket寫buffer,可參考的優化值:873200/1746400/3492800
net.core.wmem_default = 1746400

#最大socket寫buffer,可參考的優化值:1746400/3492800/6985600
net.core.wmem_max = 3492800

#缺省socket讀buffer,可參考的優化值:873200/1746400/3492800
net.core.rmem_default = 1746400

#最大socket讀buffer,可參考的優化值:1746400/3492800/6985600
net.core.rmem_max = 3492800

#進入包的最大設備隊列.默認是1000,對重負載服務器而言,該值過低,可調整到16384/32768/65535
net.core.netdev_max_backlog = 32768

#listen()的默認參數,掛起請求的最大數量.默認是128.對繁忙的服務器,增長該值有助於網絡性能.可調整到8192/16384/32768
net.core.somaxconn = 16384

#每一個socket buffer的最大補助緩存大小,默認10K(10240),也可調整到20k(20480),但建議保留
net.core.optmem_max = 10240

#表示用於向外鏈接的端口範圍.缺省狀況下過窄:32768到61000,改成1024到65535
net.ipv4.ip_local_port_range = 1024 65535

#TCP寫buffer,可參考的優化值:873200/1746400/3492800/6985600
net.ipv4.tcp_wmem = 873200 1746400 3492800

#TCP讀buffer,可參考的優化值:873200/1746400/3492800/6985600
net.ipv4.tcp_rmem = 873200 1746400 3492800

#net.ipv4.tcp_mem[0]:低於此值,TCP沒有內存壓力.
#net.ipv4.tcp_mem[1]:在此值下,進入內存壓力階段.
#net.ipv4.tcp_mem[2]:高於此值,TCP拒絕分配socket.
#上述內存單位是頁,而不是字節.可參考的優化值是:78643200/104857600/157286400
net.ipv4.tcp_mem = 78643200 104857600 157286400

#進入SYN包的最大請求隊列.默認1024.對重負載服務器,增長該值顯然有好處.可調整到16384/32768/65535
net.ipv4.tcp_max_syn_backlog = 32768

#TCP失敗重傳次數,默認值15,意味着重傳15次才完全放棄.可減小到5,以儘早釋放內核資源
net.ipv4.tcp_retries2 = 5

#如下3個參數與TCP KeepAlive有關.默認值是:
#tcp_keepalive_time = 7200 seconds (2 hours)
#tcp_keepalive_probes = 9
#tcp_keepalive_intvl = 75 seconds
#意思是若是某個TCP鏈接在idle 2個小時後,內核才發起probe.若是probe 9次(每次75秒)不成功,內核才完全放棄,認爲該鏈接已失效
#對服務器而言,顯然上述值太大.可調整到:
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 30

#表示開啓SYN Cookies,當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少許SYN攻擊,默認爲0,表示關閉
net.ipv4.tcp_syncookies = 1

#表示若是套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間
net.ipv4.tcp_fin_timeout = 30

#表示開啓重用,容許將TIME-WAIT sockets從新用於新的TCP鏈接,默認爲0,表示關閉
#net.ipv4.tcp_tw_reuse = 1

#表示開啓TCP鏈接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉
#net.ipv4.tcp_tw_recycle = 1

#表示系統同時保持TIME_WAIT套接字的最大數量,若是超過這個數字,TIME_WAIT套接字將馬上被清除並打印警告信息
#默認爲180000,建議使用默認值,不建議調小
#net.ipv4.tcp_max_tw_buckets = 180000

#其它的一些設置
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2

保存退出:
2 #sudo /sbin/sysctl -p

***************************************************************************************
php

http://www.linuxidc.com/Linux/2007-08/6995.htmhtml

Linux進行性能優化。
1)   Linux Proc文件系統,經過對Proc文件系統進行調整,達到性能優化的目的。
2)   Linux性能診斷工具,介紹如何使用Linux自帶的診斷工具進行性能診斷。
node

1)     /proc/sys/kernel/ctrl-alt-dellinux


2)     proc/sys/kernel/msgmax
該文件指定了從一個進程發送到另外一個進程的消息的最大長度(bytes)。進程間的消息傳遞是在內核的內存中進行的,不會交換到磁盤上,因此若是增長該值,則將增長操做系統所使用的內存數量。
缺省設置:8192

3)     /proc/sys/kernel/msgmnb
該文件指定一個消息隊列的最大長度(bytes)。
缺省設置:16384

4)     /proc/sys/kernel/msgmni
該文件指定消息隊列標識的最大數目,即系統範圍內最大多少個消息隊列。
缺省設置:16

5)     /proc/sys/kernel/panic
該文件表示若是發生「內核嚴重錯誤(kernel panic)」,則內核在從新引導以前等待的時間(以秒爲單位)。
零(0)秒,表示在發生內核嚴重錯誤時將禁止自動從新引導。
缺省設置:0

6)     proc/sys/kernel/shmall
該文件表示在任何給定時刻,系統上可使用的共享內存的總量(bytes)。
缺省設置:2097152

7)     /proc/sys/kernel/shmmax
該文件表示內核所容許的最大共享內存段的大小(bytes)。
缺省設置:33554432
建議設置:物理內存 * 50%
實際可用最大共享內存段大小=shmmax * 98%,其中大約2%用於共享內存結構。
能夠經過設置shmmax,而後執行ipcs -l來驗證。

8)     /proc/sys/kernel/shmmni
該文件表示用於整個系統的共享內存段的最大數目(個)。
缺省設置:4096

9)     /proc/sys/kernel/threads-max
該文件表示內核所能使用的線程的最大數目。
缺省設置:2048
 

3、/proc/sys/vm/優化
1)     /proc/sys/vm/block_dump
該文件表示是否打開Block Debug模式,用於記錄全部的讀寫及Dirty Block寫回動做。
缺省設置:0,禁用Block Debug模式

2)     /proc/sys/vm/dirty_background_ratio
該文件表示髒數據到達系統總體內存的百分比,此時觸發pdflush進程把髒數據寫回磁盤。
缺省設置:10

3)     /proc/sys/vm/dirty_expire_centisecs
該文件表示若是髒數據在內存中駐留時間超過該值,pdflush進程在下一次將把這些數據寫回磁盤。
缺省設置:3000(1/100秒)
 
4)     /proc/sys/vm/dirty_ratio
該文件表示若是進程產生的髒數據到達系統總體內存的百分比,此時進程自行把髒數據寫回磁盤。
缺省設置:40

5)     /proc/sys/vm/dirty_writeback_centisecs
該文件表示pdflush進程週期性間隔多久把髒數據寫回磁盤。
缺省設置:500(1/100秒)
 
6)     /proc/sys/vm/vfs_cache_pressure
該文件表示內核回收用於directory和inode cache內存的傾向;缺省值100表示內核將根據pagecache和swapcache,把directory和inode cache保持在一個合理的百分比;下降該值低於100,將致使內核傾向於保留directory和inode cache;增長該值超過100,將致使內核傾向於回收directory和inode cache。
缺省設置:100

7)     /proc/sys/vm/min_free_kbytes
該文件表示強制Linux VM最低保留多少空閒內存(Kbytes)。
缺省設置:724(512M物理內存)

8)     /proc/sys/vm/nr_pdflush_threads
該文件表示當前正在運行的pdflush進程數量,在I/O負載高的狀況下,內核會自動增長更多的pdflush進程。
缺省設置:2(只讀)

9)     /proc/sys/vm/overcommit_memory
該文件指定了內核針對內存分配的策略,其值能夠是0、一、2。
0, 表示內核將檢查是否有足夠的可用內存供應用進程使用;若是有足夠的可用內存,內存申請容許;不然,內存申請失敗,並把錯誤返回給應用進程。
1, 表示內核容許分配全部的物理內存,而無論當前的內存狀態如何。
2, 表示內核容許分配超過全部物理內存和交換空間總和的內存(參照overcommit_ratio)。
缺省設置:0

4、/proc/sys/fs/優化
1)     /proc/sys/fs/file-max
該文件指定了能夠分配的文件句柄的最大數目。若是用戶獲得的錯誤消息聲明因爲打開文件數已經達到了最大值,從而他們不能打開更多文件,則可能須要增長該值。
缺省設置:4096
建議設置:65536

2)     /proc/sys/fs/file-nr
該文件與 file-max 相關,它有三個值:
已分配文件句柄的數目
已使用文件句柄的數目
文件句柄的最大數目
該文件是隻讀的,僅用於顯示信息。

3)     待續。。。
 
 

6、/proc/sys/net/ipv4/優化
1)     /proc/sys/net/ipv4/ip_forward
該文件表示是否打開IP轉發。
0,禁止
1,轉發
缺省設置:0

2)     /proc/sys/net/ipv4/ip_default_ttl
該文件表示一個數據報的生存週期(Time To Live),即最多通過多少路由器。
缺省設置:64
增長該值會下降系統性能。
 
3)     /proc/sys/net/ipv4/ip_no_pmtu_disc
該文件表示在全局範圍內關閉路徑MTU探測功能。
缺省設置:0

4)     /proc/sys/net/ipv4/route/min_pmtu
該文件表示最小路徑MTU的大小。
缺省設置:552

5)     /proc/sys/net/ipv4/route/mtu_expires
該文件表示PMTU信息緩存多長時間(秒)。
缺省設置:600(秒)

6)     /proc/sys/net/ipv4/route/min_adv_mss
該文件表示最小的MSS(Maximum Segment Size)大小,取決於第一跳的路由器MTU。
缺省設置:256(bytes)

6.1 IP Fragmentation
1)     /proc/sys/net/ipv4/ipfrag_low_thresh/proc/sys/net/ipv4/ipfrag_low_thresh
兩個文件分別表示用於重組IP分段的內存分配最低值和最高值,一旦達到最高內存分配值,其它分段將被丟棄,直到達到最低內存分配值。
缺省設置:196608(ipfrag_low_thresh)
     262144(ipfrag_high_thresh)

2)     /proc/sys/net/ipv4/ipfrag_time
該文件表示一個IP分段在內存中保留多少秒。
缺省設置:30(秒)

6.2 INET Peer Storage
1)     /proc/sys/net/ipv4/inet_peer_threshold
INET對端存儲器某個合適值,當超過該閥值條目將被丟棄。該閥值一樣決定生存時間以及廢物收集經過的時間間隔。條目越多,存活期越低,GC 間隔越短。
缺省設置:65664

2)     /proc/sys/net/ipv4/inet_peer_minttl
條目的最低存活期。在重組端必需要有足夠的碎片(fragment)存活期。這個最低存活期必須保證緩衝池容積是否少於 inet_peer_threshold。該值以 jiffies爲單位測量。
缺省設置:120

3)     /proc/sys/net/ipv4/inet_peer_maxttl
條目的最大存活期。在此期限到達以後,若是緩衝池沒有耗盡壓力的話(例如:緩衝池中的條目數目很是少),不使用的條目將會超時。該值以 jiffies爲單位測量。
缺省設置:600

4)     /proc/sys/net/ipv4/inet_peer_gc_mintime
廢物收集(GC)經過的最短間隔。這個間隔會影響到緩衝池中內存的高壓力。 該值以 jiffies爲單位測量。
缺省設置:10

5)     /proc/sys/net/ipv4/inet_peer_gc_maxtime
廢物收集(GC)經過的最大間隔,這個間隔會影響到緩衝池中內存的低壓力。 該值以 jiffies爲單位測量。
缺省設置:120

6.3 TCP Variables
1)     /proc/sys/net/ipv4/tcp_syn_retries
該文件表示本機向外發起TCP SYN鏈接超時重傳的次數,不該該高於255;該值僅僅針對外出的鏈接,對於進來的鏈接由tcp_retries1控制。
缺省設置:5

2)     /proc/sys/net/ipv4/tcp_keepalive_probes
該文件表示丟棄TCP鏈接前,進行最大TCP保持鏈接偵測的次數。保持鏈接僅在SO_KEEPALIVE套接字選項被打開時才被髮送。
缺省設置:9(次)

3)     /proc/sys/net/ipv4/tcp_keepalive_time
該文件表示從再也不傳送數據到向鏈接上發送保持鏈接信號之間所需的秒數。
缺省設置:7200(2小時)

4)     /proc/sys/net/ipv4/tcp_keepalive_intvl
該文件表示發送TCP探測的頻率,乘以tcp_keepalive_probes表示斷開沒有相應的TCP鏈接的時間。
缺省設置:75(秒)

5)     /proc/sys/net/ipv4/tcp_retries1
該文件表示放棄迴應一個TCP鏈接請求前進行重傳的次數。
缺省設置:3

6)     /proc/sys/net/ipv4/tcp_retries2
該文件表示放棄在已經創建通信狀態下的一個TCP數據包前進行重傳的次數。
缺省設置:15

7)     /proc/sys/net/ipv4/tcp_orphan_retries
在近端丟棄TCP鏈接以前,要進行多少次重試。默認值是 7 個,至關於 50秒–16分鐘,視 RTO 而定。若是您的系統是負載很大的web服務器,那麼也許需
要下降該值,這類 sockets 可能會耗費大量的資源。另外參考tcp_max_orphans。

8)     /proc/sys/net/ipv4/tcp_fin_timeout
對於本端斷開的socket鏈接,TCP保持在FIN-WAIT-2狀態的時間。對方可能
會斷開鏈接或一直不結束鏈接或不可預料的進程死亡。默認值爲 60 秒。過去在2.2版本的內核中是 180 秒。您能夠設置該值,但須要注意,若是您的機器爲負載很重的web服務器,您可能要冒內存被大量無效數據報填滿的風險,FIN-WAIT-2 sockets 的危險性低於 FIN-WAIT-1,由於它們最多隻吃 1.5K的內存,可是它們存在時間更長。另外參考 tcp_max_orphans。
缺省設置:60(秒)

9)     /proc/sys/net/ipv4/tcp_max_tw_buckets系統在同時所處理的最大timewait sockets 數目。若是超過此數的話,time-wait socket 會被當即砍除而且顯示警告信息。之因此要設定這個限制,純粹爲了抵禦那些簡單的 DoS 攻擊,千萬不要人爲的下降這個限制,不過,若是網絡條件須要比默認值更多,則能夠提升它(或許還要增長內存)。
缺省設置:180000
 
 

29) /proc/sys/net/ipv4/tcp_adv_win_scale
該文件表示計算緩衝開銷bytes/2^tcp_adv_win_scale(若是tcp_adv_win_scale >; 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(若是tcp_adv_win_scale <= 0)。
缺省設置:2

6.4 IP Variables
1)     /proc/sys/net/ipv4/ip_local_port_range
該文件表示TCP/UDP協議打開的本地端口號。
缺省設置:1024 4999
建議設置:32768 61000

2)     /proc/sys/net/ipv4/ip_nonlocal_bind
該文件表示是否容許進程邦定到非本地地址。
缺省設置:0

3)     /proc/sys/net/ipv4/ip_dynaddr
該參數一般用於使用撥號鏈接的狀況,可使系統動可以當即改變ip包的源地址爲該ip地址,同時中斷原有的tcp對話而用新地址從新發出一個syn請求 包,開始新的tcp對話。在使用ip欺騙時,該參數能夠當即改變假裝地址爲新的ip地址。該文件表示是否容許動態地址,若是該值非0,表示容許;若是該值 大於1,內核將經過log記錄動態地址重寫信息。
缺省設置:0

4)     /proc/sys/net/ipv4/icmp_echo_ignore_all/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
該文件表示內核是否忽略全部的ICMP ECHO請求,或忽略廣播和多播請求。
0, 響應請求
1, 忽略請求
缺省設置:0
建議設置:1

5)     /proc/sys/net/ipv4/icmp_ratelimit

6)     /proc/sys/net/ipv4/icmp_ratemask

7)     /proc/sys/net/ipv4/icmp_ignore_bogus_error_reponses
某些路由器違背RFC1122標準,其對廣播幀發送僞造的響應來應答。這種違背行爲一般會被以告警的方式記錄在系統日誌中。若是該選項設置爲True,內核不會記錄這種警告信息。
缺省設置:0

8)     /proc/sys/net/ipv4/igmp_max_memberships
該文件表示多播組中的最大成員數量。
缺省設置:20
 
6.5 Other Configuration
1)     /proc/sys/net/ipv4/conf/*/accept_redirects
若是主機所在的網段中有兩個路由器,你將其中一個設置成了缺省網關,可是該網關在收到你的ip包時發現該ip包必須通過另一個路由器,這時這個路由器就 會給你發一個所謂的「重定向」icmp包,告訴將ip包轉發到另一個路由器。參數值爲布爾值,1表示接收這類重定向icmp 信息,0表示忽略。

2)     /proc/sys/net/ipv4/*/accept_source_route
是否接受含有源路由信息的ip包。參數值爲布爾值,1表示接受,0表示不接受。在充當網關的linux主機上缺省值爲1,在通常的linux主機上缺省值爲0。從安全性角度出發,建議關閉該功能。
 
3)     /proc/sys/net/ipv4/*/secure_redirects
其實所謂的「安全重定向」就是隻接受來自網關的「重定向」icmp包。該參數就是用來設置「安全重定向」功能的。

4)     /proc/sys/net/ipv4/*/proxy_arp
設置是否對網絡上的arp包進行中繼。參數值爲布爾值,1表示中繼,0表示忽略,
缺省值爲0。該參數一般只對充當路由器的linux主機有用。
 
7、性能優化策略
7.1 基本優化
1)      關閉後臺守護進程
系統安裝完後,系統會默認啓動一些後臺守護進程,有些進程並非必需的;所以,關閉這些進程能夠節省一部分物理內存消耗。以root身份登陸系統,運行ntsysv,選中以下進程:
iptables
network
syslog
random
apmd

2)      減小終端鏈接數
系統默認啓動6個終端,而實際上只需啓動3個便可;以root身份登陸系統,運行vi /etc/inittab,修改爲以下:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
如上所述,註釋掉四、五、6終端。
 
3)      待續。。。
 
7.2 網絡優化
1)      優化系統套接字緩衝區
net.core.rmem_max=16777216
net.core.wmem_max=16777216

2)      優化TCP接收/發送緩衝區
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216

3)      優化網絡設備接收隊列
net.core.netdev_max_backlog=3000

4)      關閉路由相關功能
net.ipv4.conf.lo.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.eth0.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
 
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
 
net.ipv4.conf.lo.secure_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.eth0.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
 
net.ipv4.conf.lo.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.eth0.send_redirects=0
net.ipv4.conf.default.send_redirects=0
5)      優化TCP協議棧 打開TCP SYN cookie選項,有助於保護服務器免受SyncFlood攻擊。 net.ipv4.tcp_syncookies=1   打開TIME-WAIT套接字重用功能,對於存在大量鏈接的Web服務器很是有效。 net.ipv4.tcp_tw_recyle=1 net.ipv4.tcp_tw_reuse=1   減小處於FIN-WAIT-2鏈接狀態的時間,使系統能夠處理更多的鏈接。 net.ipv4.tcp_fin_timeout=30   減小TCP KeepAlive鏈接偵測的時間,使系統能夠處理更多的鏈接。 net.ipv4.tcp_keepalive_time=1800   增長TCP SYN隊列長度,使系統能夠處理更多的併發鏈接。 net.ipv4.tcp_max_syn_backlog=8192
相關文章
相關標籤/搜索