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