ulimit、limits.conf、sysctl和proc文件系統

引言

當修改一個Linux系統參數或限制,比如文件打開數時,之前用到過的方式有ulimit、limits.conf、sysctl和/proc文件系統。
對這幾個東西一直比較困惑,翻了幾篇文檔,簡單寫一下它們之間的區別。

ulimit

什么是ulimit

ulimit是linux shell的內鍵命令,它具有一套參數集,用于對 shell進程 及其 子進程 進行 資源限制
例如用戶同時運行了兩個shell終端進程,只在其中一個環境中執行了ulimit – s 100,則該shell進程里創建文件的大小會有相應的限制,而另一個shell終端包括其上運行的子程序都不會受其影響。

ulimit的設定值是 per-process 的,也就是說,每個進程有自己的limits值。
使用ulimit進行修改,是 立即生效 的。
ulimit只影響shell進程及其子進程,用戶登出后失效。
可以在profile中加入ulimit的設置,變相的做到永久生效。

查看ulimit的設定值

使用ulimit -a可以查看所有的設定值:

pi@raspberrypi:~ $ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7336
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 95
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7336
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

ulimit的參數

  • -H 設置硬件資源限制.
  • -S 設置軟件資源限制.
  • -a 顯示當前所有的資源限制.
  • -c size:設置core文件的最大值.單位:blocks
  • -d size:設置數據段的最大值.單位:kbytes
  • -f size:設置創建文件的最大值.單位:blocks
  • -l size:設置在內存中鎖定進程的最大值.單位:kbytes
  • -m size:設置可以使用的常駐內存的最大值.單位:kbytes
  • -n size:設置內核可以同時打開的文件描述符的最大值.單位:n
  • -p size:設置管道緩沖區的最大值.單位:kbytes
  • -s size:設置堆棧的最大值.單位:kbytes
  • -t size:設置CPU使用時間的最大上限.單位:seconds
  • -v size:設置虛擬內存的最大值.單位:kbytes
  • unlimited 是一個特殊值,用于表示不限制

注意:

  1. -n 限制文件描述符的最大值,在Linux下一切資源皆文件,所以該參數也限制了socket鏈接數
  2. 查詢時,若不加H或S參數,默認顯示的是軟限制
  3. 修改時,若不加H或S參數,兩個參數一起改變

設置ulimit的位置

可以在以下位置進行ulimit設置:

  • /etc/profile 所有用戶有效,永久生效
  • ~/.bash_profile 當前用戶有效,永久生效
  • 直接在控制臺輸入 當前用戶有效,臨時生效
  • 放在程序的啟動腳本中

limit.conf

什么是limits.conf

limits.conf文件實際是Linux PAM中 pam_limits.so 的配置文件,pam_limits模塊對 用戶的會話 進行 資源限制

一個shell的初始limits就是由pam_limits設定的,用戶登錄后,pam_limits會給用戶的shell設定在limits.conf定義的值。

pam_limits的設定值也是 per-process 的。
pam_limits的設置是 永久生效 的。

limits.conf的位置

/etc/security/limits.conf

配置limits.conf

示例:

*    soft    nofile    655360
*    hard    nofile    655360
*    soft    noproc    655360
*    hard    noproc    655355
*    soft    core      0
*    hard    core      0

4個字段的含義分別為: domain type item value

  • domain: username|@groupname
  • type: soft、hard、-
  • item:
    core - 限制內核文件的大小
    date - 最大數據大小
    fsize - 最大文件大小
    memlock - 最大鎖定內存地址空間
    nofile - 打開文件的最大數目
    rss - 最大持久設置大小
    stack - 最大棧大小
    cpu - 以分鐘為單位的最多 CPU 時間
    noproc - 進程的最大數目
    as - 地址空間限制
    maxlogins - 此用戶允許登錄的最大數目
  • value: 值的大小

sysctl

什么是sysctl

sysctl是一個允許改變正在運行中的Linux系統的接口,修改的是針對 整個系統內核參數
sysctl的修改是 立即臨時 的(重啟后失效)。
可以通過修改sysctl.conf配置文件,達到 永久 生效。

sysctl的選項

  • -n 打印值時不打印關鍵字
  • -e 忽略未知關鍵字錯誤
  • -N 僅打印名稱
  • -w 當改變sysctl設置時使用此項
  • -p 從配置文件“/etc/sysctl.conf”加載內核參數設置
  • -a 打印當前所有可用的內核參數變量和值
  • -A 以表格方式打印當前所有可用的內核參數變量和值

查看某個內核參數

sysctl fs.file-max

fs.file-max = 93796

臨時修改某個內核參數

sysctl -w fs.file-max=100000  # 設置文件打開數
sysctl -w net.ipv4.ip_forward=1  # 開啟IP轉發

sysctl.conf配置文件

/etc/sysctl.conf

修改sysctl.conf并使其生效

修改/etc/sysctl.conf可以做到永久生效:

vi /etc/sysctl.conf

fs.file-max = 100000

最后使用-p命令從配置文件中加載內核參數,使其立即生效:

sysctl -p

sysctl.conf配置示例

下面是一個摘抄的配置示例,出處:http://www.lxweimin.com/p/9a8e383b5b49

# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536

# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.netfilter.nf_conntrack_max = 1000000
kernel.unknown_nmi_panic = 0
kernel.sysrq = 0
fs.file-max = 1000000
vm.swappiness = 10
fs.inotify.max_user_watches = 10000000
net.core.wmem_max = 327679
net.core.rmem_max = 327679
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

/proc文件系統

什么是/proc文件系統

Linux內核提供了一種通過/proc文件系統,在運行時訪問內核內部數據結構、改變內核設置的機制。
proc文件系統是一個偽文件系統,它只存在內存當中,而不占用外存空間。它以文件系統的方式為訪問系統內核數據的操作提供接口。
最初開發/proc文件系統是為了提供有關系統中進程的信息。但是由于這個文件系統非常有用,因此內核中的很多元素也開始使用它來報告信息,或啟用動態運行時配置。

對/proc中內核文件的修改,針對的是 整個系統內核參數 ,修改后 立即生效 ,但修改是 臨時 的(重啟后失效)。

/proc文件系統與sysctl.conf的對應關系

/proc/sys下內核文件與配置文件sysctl.conf中變量的對應關系:

  1. 去掉前面部分/proc/sys
  2. 將文件名中的斜杠變為點

例如:

  • /proc/sys/net/ipv4/ip_forward -> net.ipv4.ip_forward
  • /proc/sys/kernel/hostname -> kernel.hostname

/proc文件系統中幾個常用的內核文件

下面幾個是經常會用到的文件:

  • /proc/meminfo 內存信息
  • /proc/cpuinfo CPU信息
  • /proc/sys/fs/file-max 文件打開數
  • /proc/sys/fs/file-nr 整個系統目前使用的文件句柄數量

/proc文件系統中文件的權限

proc 中的每個文件都有一組分配給它的非常特殊的文件許可權,并且每個文件屬于特定的用戶標識。

  • 只讀:任何用戶都不能更改該文件;它用于表示系統信息
  • root 寫:如果 /proc 中的某個文件是可寫的,則通常只能由 root 用戶來寫
  • root 讀:有些文件對一般系統用戶是不可見的,而只對 root 用戶是可見的

對/proc進行讀寫

以開啟IP轉發為例:

cat /proc/sys/net/ipv4/ip_forward
0
echo "1" > /proc/sys/net/ipv4/ip_forward
cat /proc/sys/net/ipv4/ip_forward
1

當然,也可以使用sysctl來配置這些內核條目

內核文件詳解

  • /proc/buddyinfo 每個內存區中的每個order有多少塊可用,和內存碎片問題有關
  • /proc/cmdline 啟動時傳遞給kernel的參數信息
  • /proc/cpuinfo cpu的信息
  • /proc/crypto 內核使用的所有已安裝的加密密碼及細節
  • /proc/devices 已經加載的設備并分類
  • /proc/dma 已注冊使用的ISA DMA頻道列表
  • /proc/execdomains Linux內核當前支持的execution domains
  • /proc/fb 幀緩沖設備列表,包括數量和控制它的驅動
  • /proc/filesystems 內核當前支持的文件系統類型
  • /proc/interrupts x86架構中的每個IRQ中斷數
  • /proc/iomem 每個物理設備當前在系統內存中的映射
  • /proc/ioports 一個設備的輸入輸出所使用的注冊端口范圍
  • /proc/kcore 代表系統的物理內存,存儲為核心文件格式,里邊顯示的是字節數,等于RAM大小加上4kb
  • /proc/kmsg 記錄內核生成的信息,可以通過/sbin/klogd或/bin/dmesg來處理
  • /proc/loadavg 根據過去一段時間內CPU和IO的狀態得出的負載狀態,與uptime命令有關
  • /proc/locks 內核鎖住的文件列表
  • /proc/mdstat 多硬盤,RAID配置信息(md=multiple disks)
  • /proc/meminfo RAM使用的相關信息
  • /proc/misc 其他的主要設備(設備號為10)上注冊的驅動
  • /proc/modules 所有加載到內核的模塊列表
  • /proc/mounts 系統中使用的所有掛載
  • /proc/mtrr 系統使用的Memory Type Range Registers (MTRRs)
  • /proc/partitions 分區中的塊分配信息
  • /proc/pci 系統中的PCI設備列表
  • /proc/slabinfo 系統中所有活動的 slab 緩存信息
  • /proc/stat 所有的CPU活動信息
  • /proc/sysrq-trigger 使用echo命令來寫這個文件的時候,遠程root用戶可以執行大多數的系統請求關鍵命令,就好- 像在本地終端執行一樣。要寫入這個文件,需要把/proc/sys/kernel/sysrq不能設置為0。這個文件對root也是不可- 讀的
  • /proc/uptime 系統已經運行了多久
  • /proc/swaps 交換空間的使用情況
  • /proc/version Linux內核版本和gcc版本
  • /proc/bus 系統總線(Bus)信息,例如pci/usb等
  • /proc/driver 驅動信息
  • /proc/fs 文件系統信息
  • /proc/ide ide設備信息
  • /proc/irq 中斷請求設備信息
  • /proc/net 網卡設備信息
  • /proc/scsi scsi設備信息
  • /proc/tty tty設備信息
  • /proc/net/dev 顯示網絡適配器及統計信息
  • /proc/vmstat 虛擬內存統計信息
  • /proc/vmcore 內核panic時的內存映像
  • /proc/diskstats 取得磁盤信息
  • /proc/schedstat kernel調度器的統計信息
  • /proc/zoneinfo 顯示內存空間的統計信息,對分析虛擬內存行為很有用

以下是/proc目錄中進程N的信息:

  • /proc/N pid為N的進程信息
  • /proc/N/cmdline 進程啟動命令
  • /proc/N/cwd 鏈接到進程當前工作目錄
  • /proc/N/environ 進程環境變量列表
  • /proc/N/exe 鏈接到進程的執行命令文件
  • /proc/N/fd 包含進程相關的所有的文件描述符
  • /proc/N/maps 與進程相關的內存映射信息
  • /proc/N/mem 指代進程持有的內存,不可讀
  • /proc/N/root 鏈接到進程的根目錄
  • /proc/N/stat 進程的狀態
  • /proc/N/statm 進程使用的內存的狀態
  • /proc/N/status 進程狀態信息,比stat/statm更具可讀性
  • /proc/self 鏈接到當前正在運行的進程

參考文檔

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容