內核參數的作用域學習

內核參數作用域的情況

1. 全系統生效
2. 進程生效
3. 用戶生效
4. 協同作用.

# 本文並不會按照範圍進行單獨闡述
# 會按照一個作用鏈條進行說明.

nofile

number of file 
本質是一個進程能夠打開文件數的限制. 
是操作系統避免單個線程文件數打開過多,導致系統資源耗盡的一個保護機制. 
第一層是全局發生作用的一些參數
fs.file-max = 3265659
該參數是整個系統能夠打開的file handler 的總量. 所有的進程打開文件數總和不能超過這個數. 
需要注意, 這個是針對整個系統的限制. 
fs.nr_open = 1048576
該參數是決定單個進程最大的打開文件數. 
需要注意 這個是針對單一進程的限制. 
fs.file-nr = 9792       0       3265659
這個是一個狀態指示的文件,一共三個值,
第一個代表全局已經分配的文件描述符數量,
第二個代表自由的文件描述符(待重新分配的),
第三個代表總的文件描述符的數量。

需要注意, 這幾個參數的默認是是不一樣的. 雲服務器的一般是300萬多. 
自己搭建的centos 是 680萬
但是國產操作系統的默認值是: 9223372036854775807
位數太多, 請自己數 !-_-!

有了如上三個參數之後 就是 Linux系統裏面的 /etc/security/limits.conf
一般可以在文件的最後增加: 
* soft nofile 65535
* hard nofile 65535
需要注意, 這個參數是針對某些用戶單個線程打開的文件數限制. 
作用域最小. 但是用到的最多. 

網絡參數

網絡參數已經多次講述, 這裏主要是想描述一下幾個參數的作用域

# 全系統生效的參數:
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0 # 如果是docker後者是KMV必須打開
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 5000

# 針對具體進程生效的全局參數
net.core.netdev_max_backlog = 5000
net.ipv4.ip_local_port_range = 2000 65000
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096

網絡參數

着重說明幾個參數
1. backlog
backlog 是絕對單個進程TCP全連接大小的一個絕對因素.
都是配置全局生效,但是作用域是針對單個進程/線程來區分的.

2. net.ipv4.ip_local_port_range
的參數也類似. 是全局生效,但是一組相同的對端 TCP四元組來進行限制.
比如 我nginx可以使用portreuse的方式實現多個進程進行綁定 同一個端口號
但是port_range是針對TCP的四元組來進行限制,不是根據多個worker進程來進行成績限制
他限制的是TCP級別的總量,而不是進程級別

3. net.ipv4.tcp_max_tw_buckets
這個參數是一個總計參數.
是所有的進程time_wait的總計個數.  不區分進程進行統計 
作用域是整個系統. 
所有的TCP連接的time_wait總量是這個數據. 

4. 關於文件參數和網絡參數.
文件的TCP建立數量絕對不可能大於nofile的數量
unix 裏面一切皆文件. 
C100K理論 至少兩個進程 並且nofile 也要接近或者是超過100k個有可能實現. 

大頁內存的優勢

1. 大頁內會不會因爲內存壓力導致被swap到磁盤空間.
   這會保證內存一直在物理內存中,性能最好. 
2. 大頁內存佔用的頁表項比較少,相同大小的TLB可以管理更大空間的內容
   OS或者是Oracle在尋址時TLB被刷新的概率會減少.
   能夠極大的提高系統的性能, 避免出現性能衰退. 

大頁內存

Oracle數據庫爲了提高性能, 在大內存的情況下 要求啓用大頁內存
# 需要注意, Oracle要求關閉 紅帽開發的透明大頁. 
主要涉及的參數有:
第一步查看大頁內存的大小
cat /proc/meminfo | grep Huge
Hugepagesize:       2048 kB
Hugepagesize:     524288 kB  # 華爲雲鯤鵬虛擬機. 
# 注意這個參數一般的系統默認值是 2MB, 但是華爲雲鯤鵬默認值是 512MB
支持的大頁內存大小可以通過如下目錄進行查看:
ls  /sys/kernel/mm/hugepages/
ARM機器的結果爲:
hugepages-2048kB  hugepages-524288kB
x86機器的結果爲:
hugepages-1048576kB  hugepages-2048kB
# 理論上可以修改.  內存頁面的默認大小都是4KB. 不過部分ARM服務器是 64KB 
getconf PAGE_SIZE
部分ARM機器的爲: 
65536
x86機器的爲:
4096

大頁內存

第二步 設置大頁數量
編輯配置文件: sysctl.conf
增加一行
vm.nr_hugepages = 10240
在2MB大頁的情況下, 會創建20G的大頁空間. 
sysctl -p 可以使之生效. 

另外還有一些參數: 
shmall 是全部允許使用的共享內存大小,
shmmax 是單個段允許使用的大小。這兩個可以設置爲內存的 90%。
例如 16G 內存:
shmmax 的大小爲 16*1024*1024*1024*90% = 15461882265,
shmall 的大小爲 15461882265/4k(getconf PAGESIZE可得到) = 3774873。

增加memlock的限制
*    hard   memlock           unlimited
*    soft   memlock           unlimited

大頁內存的其他設置

1. Oracle更改SGA或者是memory_target的數值
   注意這個數值不能的大於 getconf PAGESIZE * vm.nr_hugepages
   建議要稍微小一些. 
   也不能大於shmmax

2. JVM啓動服務時的設置. 
   增加配置節: -XX:+UseLargePages  -XX:LargePageSizeInBytes=2m
   一般只有大於32G的堆區設置大頁內存纔會有提升. 較小的堆區意義不大. 
   建議與Oracle一樣, 不要大於系統的設置值. 
   因爲大頁內容相當於申請出來,一程序不會進行使用的. 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章