ulimit、limits.conf、sysctl和proc文件系統(tǒng)

引言

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

ulimit

什么是ulimit

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

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

查看ulimit的設(shè)定值

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

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的參數(shù)

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

注意:

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

設(shè)置ulimit的位置

可以在以下位置進行ulimit設(shè)置:

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

limit.conf

什么是limits.conf

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

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

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

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 - 限制內(nèi)核文件的大小
    date - 最大數(shù)據(jù)大小
    fsize - 最大文件大小
    memlock - 最大鎖定內(nèi)存地址空間
    nofile - 打開文件的最大數(shù)目
    rss - 最大持久設(shè)置大小
    stack - 最大棧大小
    cpu - 以分鐘為單位的最多 CPU 時間
    noproc - 進程的最大數(shù)目
    as - 地址空間限制
    maxlogins - 此用戶允許登錄的最大數(shù)目
  • value: 值的大小

sysctl

什么是sysctl

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

sysctl的選項

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

查看某個內(nèi)核參數(shù)

sysctl fs.file-max

fs.file-max = 93796

臨時修改某個內(nèi)核參數(shù)

sysctl -w fs.file-max=100000  # 設(shè)置文件打開數(shù)
sysctl -w net.ipv4.ip_forward=1  # 開啟IP轉(zhuǎn)發(fā)

sysctl.conf配置文件

/etc/sysctl.conf

修改sysctl.conf并使其生效

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

vi /etc/sysctl.conf

fs.file-max = 100000

最后使用-p命令從配置文件中加載內(nèi)核參數(shù),使其立即生效:

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文件系統(tǒng)

什么是/proc文件系統(tǒng)

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

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

/proc文件系統(tǒng)與sysctl.conf的對應(yīng)關(guān)系

/proc/sys下內(nèi)核文件與配置文件sysctl.conf中變量的對應(yīng)關(guān)系:

  1. 去掉前面部分/proc/sys
  2. 將文件名中的斜杠變?yōu)辄c

例如:

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

/proc文件系統(tǒng)中幾個常用的內(nèi)核文件

下面幾個是經(jīng)常會用到的文件:

  • /proc/meminfo 內(nèi)存信息
  • /proc/cpuinfo CPU信息
  • /proc/sys/fs/file-max 文件打開數(shù)
  • /proc/sys/fs/file-nr 整個系統(tǒng)目前使用的文件句柄數(shù)量

/proc文件系統(tǒng)中文件的權(quán)限

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

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

對/proc進行讀寫

以開啟IP轉(zhuǎn)發(fā)為例:

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來配置這些內(nèi)核條目

內(nèi)核文件詳解

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

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

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

參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容