天天看點

Linux 核心調優

以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 &gt; $fileRfc;done

本文轉自 紫色葡萄 51CTO部落格,原文連結:http://blog.51cto.com/purplegrape/1353861,如需轉載請自行聯系原作者