以nginx 10k并發連接配接為優化目标,附簡單介紹,不一一解釋。
一、tcp容量規劃
1
2
3
4
5
6
7
<code>net.ipv4.tcp_mem = 262144 524288 786432</code>
<code>net.core.wmem_max = 16777216</code>
<code>net.core.wmem_default = 131072</code>
<code>net.core.rmem_max = 16777216</code>
<code>net.core.rmem_default = 131072</code>
<code>net.ipv4.tcp_wmem = 4096 131072 16777216</code>
<code>net.ipv4.tcp_rmem = 4096 131072 16777216</code>
net.ipv4.tcp_mem
機關是記憶體頁,一般是4k,三個值分别代表tcp記憶體使用的水準,低、中、高,
低表示無記憶體壓力,中級表示記憶體壓力狀态,高表示記憶體吃緊,最高峰時系統将會拒絕配置設定記憶體。
262144 代表1G記憶體,即(262144x4/1024/1024),其他類推。
下面的參數機關都是位元組
net.core.wmem_max 和net.core.wmem_default 會覆寫net.ipv4.tcp_wmem 的第二第三個值,
同理,net.core.rmem_max 和 net.core.rmem_default 會覆寫net.ipv4.tcp_rmem 的第二第三個值。
稍微提高tcp讀寫緩沖區的容量,可以增加tcp傳輸效率,比如上文預設值131072=128k,現有一個1M的檔案傳輸,隻需8次傳輸即可,比較适合圖檔類傳輸。但也不是越大越好,比如一個文字頁面隻有15k,使用128k的記憶體顯然有些浪費。
上文tcp壓力狀态下的容量為2G,對應tcp讀寫緩沖區128k,可應對的連接配接數為16384 (2048x1024/128),可滿足10k要求。
二、tcp連接配接行為管理
8
9
10
11
12
<code>net.ipv4.tcp_tw_reuse = 1</code>
<code>net.ipv4.tcp_tw_recycle = 1</code>
<code>net.ipv4.tcp_timestamps = 1</code>
<code>net.ipv4.tcp_fin_timeout = 30</code>
<code>net.ipv4.tcp_max_tw_buckets = 8192</code>
<code>net.ipv4.tcp_retries1 = 3</code>
<code>net.ipv4.tcp_retries2 = 5</code>
<code>net.ipv4.tcp_keepalive_time = 1800</code>
<code>net.ipv4.tcp_keepalive_probes = 5</code>
<code>net.ipv4.tcp_keepalive_intvl = 30</code>
<code>net.ipv4.tcp_max_syn_backlog = 8192</code>
<code>net.ipv4.tcp_max_orphans = 262144</code>
上面主要是tcp連接配接行為的伴随的參數,主要是tcp重用,增加隊列,減少等待重試頻率等等來提升效率。
三、記憶體管理
<code>vm.swappiness = </code><code>5</code>
<code>vm.dirty_ratio = </code><code>40</code>
<code>vm.min_free_kbytes = </code><code>524288</code>
<code>vm.vfs_cache_pressure = </code><code>100</code>
vm.swappiness = 5 表示實體記憶體剩餘5%時,才考慮使用swap,預設60,這顯然非常不合理
vm.dirty_ratio = 40 表示拿出實體記憶體的40%用于寫緩存,而不立即将資料寫入硬碟。由于硬碟是衆所周知的瓶頸,擴大它可提升寫的效率,40%是個比較合适的比例。
vm.min_free_kbytes = 524288 這個用于控制剩餘記憶體的大小,524288=512M,可根據需要調整。如果某些任務臨時需要大量記憶體,可臨時将它調大然後調小,回收頁面緩存。它比vm.drop_caches 要溫和得多,後者更粗暴。
vm.vfs_cache_pressure = 100 ,如果要盡快将髒資料刷進硬碟,提高它,比如150 。
四、核心其他行為
<code>net.core.somaxconn = 8192</code>
<code>net.core.netdev_max_backlog = 8192</code>
<code>net.ipv4.ip_local_port_range = 15000 65000</code>
<code>net.netfilter.nf_conntrack_max = 131072</code>
<code>net.nf_conntrack_max = 131072</code>
<code>net.ipv6.conf.all.disable_ipv6 = 1</code>
<code>net.netfilter.nf_conntrack_tcp_timeout_established = 3600</code>
<code>net.core.rps_sock_flow_entries = 32768</code>
net.core.somaxconn 表示socket的最大連接配接數,預設128,對于php-fpm使用unix socket情況下,需要調大。
net.netfilter.nf_conntrack_tcp_timeout_established = 3600 預設2天時間,多數情況下,調小這個參數是有益的,如果是tcp長連接配接,這個參數可能不太合适。
net.core.rps_sock_flow_entries 這個參數啟用RPS,自動将網卡中斷均勻配置設定到多個CPU,改進網卡性能和系統負載。
RPS還需要腳本配合
for fileRfc in $(ls /sys/class/net/eth*/queues/rx-*/rps_flow_cnt);do echo 2048 > $fileRfc;done
本文轉自 紫色葡萄 51CTO部落格,原文連結:http://blog.51cto.com/purplegrape/1353861,如需轉載請自行聯系原作者