引言
當(dāng)修改一個(gè)Linux系統(tǒng)參數(shù)或限制嗤瞎,比如文件打開數(shù)時(shí),之前用到過的方式有ulimit听系、limits.conf贝奇、sysctl和/proc文件系統(tǒng)。
對(duì)這幾個(gè)東西一直比較困惑靠胜,翻了幾篇文檔掉瞳,簡(jiǎn)單寫一下它們之間的區(qū)別。
ulimit
什么是ulimit
ulimit是linux shell的內(nèi)鍵命令髓帽,它具有一套參數(shù)集菠赚,用于對(duì) shell進(jìn)程 及其 子進(jìn)程 進(jìn)行 資源限制。
例如用戶同時(shí)運(yùn)行了兩個(gè)shell終端進(jìn)程郑藏,只在其中一個(gè)環(huán)境中執(zhí)行了ulimit – s 100
衡查,則該shell進(jìn)程里創(chuàng)建文件的大小會(huì)有相應(yīng)的限制,而另一個(gè)shell終端包括其上運(yùn)行的子程序都不會(huì)受其影響必盖。
ulimit的設(shè)定值是 per-process 的拌牲,也就是說,每個(gè)進(jìn)程有自己的limits值歌粥。
使用ulimit進(jìn)行修改塌忽,是 立即生效 的。
ulimit只影響shell進(jìn)程及其子進(jìn)程失驶,用戶登出后失效土居。
可以在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 顯示當(dāng)前所有的資源限制.
- -c size:設(shè)置core文件的最大值.單位:blocks
- -d size:設(shè)置數(shù)據(jù)段的最大值.單位:kbytes
- -f size:設(shè)置創(chuàng)建文件的最大值.單位:blocks
- -l size:設(shè)置在內(nèi)存中鎖定進(jìn)程的最大值.單位:kbytes
- -m size:設(shè)置可以使用的常駐內(nèi)存的最大值.單位:kbytes
- -n size:設(shè)置內(nèi)核可以同時(shí)打開的文件描述符的最大值.單位:n
- -p size:設(shè)置管道緩沖區(qū)的最大值.單位:kbytes
- -s size:設(shè)置堆棧的最大值.單位:kbytes
- -t size:設(shè)置CPU使用時(shí)間的最大上限.單位:seconds
- -v size:設(shè)置虛擬內(nèi)存的最大值.單位:kbytes
- unlimited 是一個(gè)特殊值擦耀,用于表示不限制
注意:
- -n 限制文件描述符的最大值棉圈,在Linux下一切資源皆文件,所以該參數(shù)也限制了socket鏈接數(shù)
- 查詢時(shí)眷蜓,若不加H或S參數(shù)分瘾,默認(rèn)顯示的是軟限制
- 修改時(shí),若不加H或S參數(shù)吁系,兩個(gè)參數(shù)一起改變
設(shè)置ulimit的位置
可以在以下位置進(jìn)行ulimit設(shè)置:
-
/etc/profile
所有用戶有效德召,永久生效 -
~/.bash_profile
當(dāng)前用戶有效,永久生效 - 直接在控制臺(tái)輸入 當(dāng)前用戶有效汽纤,臨時(shí)生效
- 放在程序的啟動(dòng)腳本中
limit.conf
什么是limits.conf
limits.conf文件實(shí)際是Linux PAM中 pam_limits.so 的配置文件上岗,pam_limits模塊對(duì) 用戶的會(huì)話 進(jìn)行 資源限制。
一個(gè)shell的初始limits就是由pam_limits設(shè)定的蕴坪,用戶登錄后液茎,pam_limits會(huì)給用戶的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個(gè)字段的含義分別為: 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 時(shí)間
noproc - 進(jìn)程的最大數(shù)目
as - 地址空間限制
maxlogins - 此用戶允許登錄的最大數(shù)目 - value: 值的大小
sysctl
什么是sysctl
sysctl是一個(gè)允許改變正在運(yùn)行中的Linux系統(tǒng)的接口,修改的是針對(duì) 整個(gè)系統(tǒng) 的 內(nèi)核參數(shù)谒养。
sysctl的修改是 立即 且 臨時(shí) 的(重啟后失效)挺狰。
可以通過修改sysctl.conf配置文件,達(dá)到 永久 生效买窟。
sysctl的選項(xiàng)
- -n 打印值時(shí)不打印關(guān)鍵字
- -e 忽略未知關(guān)鍵字錯(cuò)誤
- -N 僅打印名稱
- -w 當(dāng)改變sysctl設(shè)置時(shí)使用此項(xiàng)
- -p 從配置文件“/etc/sysctl.conf”加載內(nèi)核參數(shù)設(shè)置
- -a 打印當(dāng)前所有可用的內(nèi)核參數(shù)變量和值
- -A 以表格方式打印當(dāng)前所有可用的內(nèi)核參數(shù)變量和值
查看某個(gè)內(nèi)核參數(shù)
sysctl fs.file-max
fs.file-max = 93796
臨時(shí)修改某個(gè)內(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配置示例
下面是一個(gè)摘抄的配置示例,出處:http://www.reibang.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)始绍,在運(yùn)行時(shí)訪問內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)瞳购、改變內(nèi)核設(shè)置的機(jī)制。
proc文件系統(tǒng)是一個(gè)偽文件系統(tǒng)亏推,它只存在內(nèi)存當(dāng)中学赛,而不占用外存空間。它以文件系統(tǒng)的方式為訪問系統(tǒng)內(nèi)核數(shù)據(jù)的操作提供接口吞杭。
最初開發(fā)/proc文件系統(tǒng)是為了提供有關(guān)系統(tǒng)中進(jìn)程的信息盏浇。但是由于這個(gè)文件系統(tǒng)非常有用,因此內(nèi)核中的很多元素也開始使用它來報(bào)告信息芽狗,或啟用動(dòng)態(tài)運(yùn)行時(shí)配置绢掰。
對(duì)/proc中內(nèi)核文件的修改,針對(duì)的是 整個(gè)系統(tǒng) 的 內(nèi)核參數(shù) ,修改后 立即生效 滴劲,但修改是 臨時(shí) 的(重啟后失效)攻晒。
/proc文件系統(tǒng)與sysctl.conf的對(duì)應(yīng)關(guān)系
/proc/sys下內(nèi)核文件與配置文件sysctl.conf中變量的對(duì)應(yīng)關(guān)系:
- 去掉前面部分/proc/sys
- 將文件名中的斜杠變?yōu)辄c(diǎn)
例如:
- /proc/sys/net/ipv4/ip_forward -> net.ipv4.ip_forward
- /proc/sys/kernel/hostname -> kernel.hostname
/proc文件系統(tǒng)中幾個(gè)常用的內(nèi)核文件
下面幾個(gè)是經(jīng)常會(huì)用到的文件:
- /proc/meminfo 內(nèi)存信息
- /proc/cpuinfo CPU信息
- /proc/sys/fs/file-max 文件打開數(shù)
- /proc/sys/fs/file-nr 整個(gè)系統(tǒng)目前使用的文件句柄數(shù)量
/proc文件系統(tǒng)中文件的權(quán)限
proc 中的每個(gè)文件都有一組分配給它的非常特殊的文件許可權(quán),并且每個(gè)文件屬于特定的用戶標(biāo)識(shí)哑芹。
- 只讀:任何用戶都不能更改該文件炎辨;它用于表示系統(tǒng)信息
- root 寫:如果 /proc 中的某個(gè)文件是可寫的,則通常只能由 root 用戶來寫
- root 讀:有些文件對(duì)一般系統(tǒng)用戶是不可見的聪姿,而只對(duì) root 用戶是可見的
對(duì)/proc進(jìn)行讀寫
以開啟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
當(dāng)然碴萧,也可以使用sysctl來配置這些內(nèi)核條目
內(nèi)核文件詳解
- /proc/buddyinfo 每個(gè)內(nèi)存區(qū)中的每個(gè)order有多少塊可用,和內(nèi)存碎片問題有關(guān)
- /proc/cmdline 啟動(dòng)時(shí)傳遞給kernel的參數(shù)信息
- /proc/cpuinfo cpu的信息
- /proc/crypto 內(nèi)核使用的所有已安裝的加密密碼及細(xì)節(jié)
- /proc/devices 已經(jīng)加載的設(shè)備并分類
- /proc/dma 已注冊(cè)使用的ISA DMA頻道列表
- /proc/execdomains Linux內(nèi)核當(dāng)前支持的execution domains
- /proc/fb 幀緩沖設(shè)備列表末购,包括數(shù)量和控制它的驅(qū)動(dòng)
- /proc/filesystems 內(nèi)核當(dāng)前支持的文件系統(tǒng)類型
- /proc/interrupts x86架構(gòu)中的每個(gè)IRQ中斷數(shù)
- /proc/iomem 每個(gè)物理設(shè)備當(dāng)前在系統(tǒng)內(nèi)存中的映射
- /proc/ioports 一個(gè)設(shè)備的輸入輸出所使用的注冊(cè)端口范圍
- /proc/kcore 代表系統(tǒng)的物理內(nèi)存破喻,存儲(chǔ)為核心文件格式,里邊顯示的是字節(jié)數(shù)盟榴,等于RAM大小加上4kb
- /proc/kmsg 記錄內(nèi)核生成的信息曹质,可以通過/sbin/klogd或/bin/dmesg來處理
- /proc/loadavg 根據(jù)過去一段時(shí)間內(nèi)CPU和IO的狀態(tài)得出的負(fù)載狀態(tài),與uptime命令有關(guān)
- /proc/locks 內(nèi)核鎖住的文件列表
- /proc/mdstat 多硬盤擎场,RAID配置信息(md=multiple disks)
- /proc/meminfo RAM使用的相關(guān)信息
- /proc/misc 其他的主要設(shè)備(設(shè)備號(hào)為10)上注冊(cè)的驅(qū)動(dòng)
- /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)中所有活動(dòng)的 slab 緩存信息
- /proc/stat 所有的CPU活動(dòng)信息
- /proc/sysrq-trigger 使用echo命令來寫這個(gè)文件的時(shí)候羽德,遠(yuǎn)程root用戶可以執(zhí)行大多數(shù)的系統(tǒng)請(qǐng)求關(guān)鍵命令,就好- 像在本地終端執(zhí)行一樣迅办。要寫入這個(gè)文件宅静,需要把/proc/sys/kernel/sysrq不能設(shè)置為0。這個(gè)文件對(duì)root也是不可- 讀的
- /proc/uptime 系統(tǒng)已經(jīng)運(yùn)行了多久
- /proc/swaps 交換空間的使用情況
- /proc/version Linux內(nèi)核版本和gcc版本
- /proc/bus 系統(tǒng)總線(Bus)信息站欺,例如pci/usb等
- /proc/driver 驅(qū)動(dòng)信息
- /proc/fs 文件系統(tǒng)信息
- /proc/ide ide設(shè)備信息
- /proc/irq 中斷請(qǐng)求設(shè)備信息
- /proc/net 網(wǎng)卡設(shè)備信息
- /proc/scsi scsi設(shè)備信息
- /proc/tty tty設(shè)備信息
- /proc/net/dev 顯示網(wǎng)絡(luò)適配器及統(tǒng)計(jì)信息
- /proc/vmstat 虛擬內(nèi)存統(tǒng)計(jì)信息
- /proc/vmcore 內(nèi)核panic時(shí)的內(nèi)存映像
- /proc/diskstats 取得磁盤信息
- /proc/schedstat kernel調(diào)度器的統(tǒng)計(jì)信息
- /proc/zoneinfo 顯示內(nèi)存空間的統(tǒng)計(jì)信息姨夹,對(duì)分析虛擬內(nèi)存行為很有用
以下是/proc目錄中進(jìn)程N(yùn)的信息:
- /proc/N pid為N的進(jìn)程信息
- /proc/N/cmdline 進(jìn)程啟動(dòng)命令
- /proc/N/cwd 鏈接到進(jìn)程當(dāng)前工作目錄
- /proc/N/environ 進(jìn)程環(huán)境變量列表
- /proc/N/exe 鏈接到進(jìn)程的執(zhí)行命令文件
- /proc/N/fd 包含進(jìn)程相關(guān)的所有的文件描述符
- /proc/N/maps 與進(jìn)程相關(guān)的內(nèi)存映射信息
- /proc/N/mem 指代進(jìn)程持有的內(nèi)存,不可讀
- /proc/N/root 鏈接到進(jìn)程的根目錄
- /proc/N/stat 進(jìn)程的狀態(tài)
- /proc/N/statm 進(jìn)程使用的內(nèi)存的狀態(tài)
- /proc/N/status 進(jìn)程狀態(tài)信息矾策,比stat/statm更具可讀性
- /proc/self 鏈接到當(dāng)前正在運(yùn)行的進(jìn)程
參考文檔
- 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.reibang.com/p/23ee9db2a620
- http://www.reibang.com/p/9a8e383b5b49
- http://www.reibang.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