引言
當修改一個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 是一個特殊值,用于表示不限制
注意:
- -n 限制文件描述符的最大值,在Linux下一切資源皆文件,所以該參數(shù)也限制了socket鏈接數(shù)
- 查詢時,若不加H或S參數(shù),默認顯示的是軟限制
- 修改時,若不加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)系:
- 去掉前面部分/proc/sys
- 將文件名中的斜杠變?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 鏈接到當前正在運行的進程
參考文檔
- https://www.ibm.com/developerworks/cn/linux/l-cn-ulimit/
- http://www.linuxhowtos.org/Tips%20and%20Tricks/ulimit.htm
- https://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/
- http://www.lxweimin.com/p/23ee9db2a620
- http://www.lxweimin.com/p/9a8e383b5b49
- http://www.lxweimin.com/p/d71e20f51aab
- https://www.ibm.com/developerworks/cn/linux/l-proc.html
- http://feichashao.com/ulimit_demo/
- http://www.linux-pam.org/Linux-PAM-html/sag-pam_limits.html