引言
當修改一個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 是一個特殊值,用于表示不限制
注意:
- -n 限制文件描述符的最大值,在Linux下一切資源皆文件,所以該參數也限制了socket鏈接數
- 查詢時,若不加H或S參數,默認顯示的是軟限制
- 修改時,若不加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中變量的對應關系:
- 去掉前面部分/proc/sys
- 將文件名中的斜杠變為點
例如:
- /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 鏈接到當前正在運行的進程
參考文檔
- 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