limits.conf文件實(shí)際是linux PAM(插入式認(rèn)證模塊,Pluggable Authentication Modules)中 pam_limits.so 的配置文件,突破系統(tǒng)的默認(rèn)限制,對(duì)系統(tǒng)訪問(wèn)資源有一定保護(hù)作用。 limits.conf 和sysctl.conf區(qū)別在于limits.conf是針對(duì)用戶(hù),而sysctl.conf是針對(duì)整個(gè)系統(tǒng)參數(shù)配置。
limits.conf是pam_limits.so的配置文件,然后/etc/pam.d/下的應(yīng)用程序調(diào)用pam_***.so模塊。譬如說(shuō),當(dāng)用戶(hù)訪問(wèn)服務(wù)器,服務(wù)程序?qū)⒄?qǐng)求發(fā)送到PAM模塊,PAM模塊根據(jù)服務(wù)名稱(chēng)在/etc/pam.d目錄下選擇一個(gè)對(duì)應(yīng)的服務(wù)文件,然后根據(jù)服務(wù)文件的內(nèi)容選擇具體的PAM模塊進(jìn)行處理。
username|@groupname type resource limit
1)username|@groupname
設(shè)置需要被限制的用戶(hù)名,組名前面加@和用戶(hù)名區(qū)別。也可用通配符*來(lái)做所有用戶(hù)的限制
2)type
類(lèi)型有soft,hard 和 -
3)resource: 表示要限制的資源
限制admin用戶(hù)登錄到sshd的服務(wù)不能超 過(guò)2個(gè)
echo session required pam_limits.so >> /etc/pam.d/sshd echo admin - maxlogins 2 >> /etc/security/limits.conf
ulimit 用于限制 shell 啟動(dòng)進(jìn)程所占用的資源,支持以下各種類(lèi)型的限制:所創(chuàng)建的內(nèi)核文件的大小、進(jìn)程數(shù)據(jù)塊的大小、Shell 進(jìn)程創(chuàng)建文件的大小、內(nèi)存鎖住的大小、常駐內(nèi)存集的大小、打開(kāi)文件描述符的數(shù)量、分配堆棧的最大大小、CPU 時(shí)間、單個(gè)用戶(hù)的最大線程數(shù)、Shell 進(jìn)程所能使用的最大虛擬內(nèi)存。同時(shí),它支持硬資源和軟資源的限制
作為臨時(shí)限制,ulimit 可以作用于通過(guò)使用其命令登錄的 shell 會(huì)話,在會(huì)話終止時(shí)便結(jié)束限制,并不影響于其他 shell 會(huì)話。而對(duì)于長(zhǎng)期的固定限制,ulimit 命令語(yǔ)句又可以被添加到由登錄 shell 讀取的文件中,作用于特定的 shell 用戶(hù)
ulimit命令用來(lái)限制系統(tǒng)用戶(hù)對(duì)shell資源的訪問(wèn),常用參數(shù)解釋如下
ulimit(選項(xiàng))-a:顯示目前資源限制的設(shè)定;-c <core文件上限>:設(shè)定core文件的最大值,單位為區(qū)塊;-d <數(shù)據(jù)節(jié)區(qū)大小>:程序數(shù)據(jù)節(jié)區(qū)的最大值,單位為KB;-f <文件大小>:shell所能建立的最大文件,單位為區(qū)塊;-H:設(shè)定資源的硬性限制,也就是管理員所設(shè)下的限制;-m <內(nèi)存大小>:指定可使用內(nèi)存的上限,單位為KB;-n <文件數(shù)目>:指定同一時(shí)間最多可開(kāi)啟的文件數(shù);-p <緩沖區(qū)大小>:指定管道緩沖區(qū)的大小,單位512字節(jié);-s <堆疊大小>:指定堆疊的上限,單位為KB;-S:設(shè)定資源的彈性限制;-t <CPU時(shí)間>:指定CPU使用時(shí)間的上限,單位為秒;-u <程序數(shù)目>:用戶(hù)最多可開(kāi)啟的程序數(shù)目;-v <虛擬內(nèi)存大小>:指定可使用的虛擬內(nèi)存上限,單位為KB。
Linux是有文件句柄限制的,而且Linux默認(rèn)不是很高,一般都是1024,生產(chǎn)服務(wù)器用其實(shí)很容易就達(dá)到這個(gè)數(shù)量
系統(tǒng)的限制文件在 /proc/sys/fs/file-max 、/proc/sys/fs/file-nr中
決定了當(dāng)前內(nèi)核可以打開(kāi)的最大的文件句柄數(shù)
The value in file-max denotes the maximum number of file handles that the Linux kernel will allocate. When you get a lot of error messages about running out of file handles, you might want to raise this limit. The default value is 10% of RAM in kilobytes. To change it, just write the new number into the file
意思是file-max一般為內(nèi)存大小(KB)的10%來(lái)計(jì)算,如果使用shell,可以這樣計(jì)算
grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'Historically, the three values in file-nr denoted the number of allocated file handles, the number of allocated but unused file handles, and the maximum number of file handles. Linux 2.6 always reports 0 as the number of free file handles -- this is not an error, it just means that the number of allocated file handles exactly matches the number of used file handles.
查找文件句柄問(wèn)題的時(shí)候,還有一個(gè)很實(shí)用的程序lsof.可以很方便看到某個(gè)進(jìn)程開(kāi)了那些句柄.也可以看到某個(gè)文件/目錄被什么進(jìn)程占用了.
lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more修改完重新登錄就可以見(jiàn)到,使用 ulimit -a 查看確認(rèn)
1)使用命令修改
查詢(xún)當(dāng)前終端的文件句柄數(shù): ulimit -n 回車(chē),一般的系統(tǒng)默認(rèn)的1024.
修改文件句柄數(shù)為65535,ulimit -n 65535.此時(shí)系統(tǒng)的文件句柄數(shù)為65535.
2)將ulimit 值添加到/etc/profile文件中(適用于有root權(quán)限登錄的系統(tǒng))
為了每次系統(tǒng)重新啟動(dòng)時(shí),都可以獲取更大的ulimit值,將ulimit 加入到/etc/profile 文件底部
echo ulimit -n 65535 >>/etc/profilesource /etc/profileulimit -n
3)OK,好多朋友都以為大功告成了,可以突然發(fā)現(xiàn)自己再次登錄進(jìn)來(lái)的時(shí)候,ulimit的值還是1024,這是為什么呢?
關(guān)鍵的原因是你登錄的用戶(hù)是什么身份,是不是root用戶(hù),由于服務(wù)器的root用戶(hù)權(quán)限很大,一般是不能用來(lái)登錄的,都是通過(guò)自己本人的登錄權(quán)限進(jìn)行登錄,并通過(guò)sudo方式切換到root用戶(hù)下進(jìn)行工作。 用戶(hù)登錄的時(shí)候執(zhí)行sh腳本的順序:
/etc/profile.d/file /etc/profile /etc/bashrc /home/.admin/.bashrc /home/.admin/.bash_profile
由于ulimit -n的腳本命令加載在第二部分,用戶(hù)登錄時(shí)由于權(quán)限原因在第二步還不能完成ulimit的修改,所以u(píng)limit的值還是系統(tǒng)默認(rèn)的1024
解決辦法: 修改linux的軟硬件限制文件
echo '* soft nproc 11000* hard nproc 11000* soft nofile 655350* hard nofile 655350' >> /etc/security/limits.conf
4)經(jīng)過(guò)以上修改,在有些系統(tǒng)中,用一般用戶(hù)再登陸,仍然沒(méi)有修改過(guò)來(lái),那么需要檢查是否有如下文件,如果沒(méi)有,則要添加如下內(nèi)容:
echo session required /lib/security/pam_limits.so >> /etc/pam.d/sshdservice sshd reload
5)如果仍然不行,那么需要修改如下文件
echo UsePrivilegeSeparation no >> /etc/ssh/sshd_config
1、file-max 是內(nèi)核級(jí)別的,所有的進(jìn)程總和不能超過(guò)這個(gè)數(shù)
2、ulimit是進(jìn)程級(jí)別的
me@superme:~$ ulimit -n1024me@superme:~$ lsof | grep me | wc -l8145#!/usr/bin/perl$count = 0;@filedescriptors;while ($count <= 1024) { $FILE = ${count}; open $FILE, ">", "/tmp/example$count" or die "/n/n FDs: $count $!"; push(@filedescriptors, $FILE); $count ++;}//FDs: 1021 Too many open files at ./test.pl line 8.//1021 because there were 3 open file descriptors before reaching the while loop (stdout, stdin and stderr)
目前為止我們還不需要IPv6,系統(tǒng)安裝完之后是自帶并且開(kāi)啟了的,需要我們關(guān)閉
ifconfig | grep inet6 || lsmod | grep ipv6
1、如果出現(xiàn)inet6 addr…的字樣,說(shuō)明就是安裝了
2、顯示內(nèi)核加載的ipv6相關(guān)模塊
通過(guò)以下命令禁用
sed -i 's/^NETWORKING_IPV6=yes/NETWORKING_IPV6=no/' /etc/sysconfig/networkecho 'alias net-pf-10 offalias ipv6 off ' >> /etc/modprobe.d/dist.confchkconfig ip6tables off
sysctl命令被用于在內(nèi)核運(yùn)行時(shí)動(dòng)態(tài)地修改內(nèi)核的運(yùn)行參數(shù),可用的內(nèi)核參數(shù)在目錄/proc/sys中。它包含一些TCP/IP堆棧和虛擬內(nèi)存系統(tǒng)的高級(jí)選項(xiàng), 這可以讓有經(jīng)驗(yàn)的管理員提高引人注目的系統(tǒng)性能。用sysctl可以讀取設(shè)置超過(guò)五百個(gè)系統(tǒng)變量
這是一個(gè)在網(wǎng)絡(luò)上流傳依舊的sysctl.conf優(yōu)化配置sysctl.conf設(shè)置
#禁用包過(guò)濾功能net.ipv4.ip_forward = 0#啟用源路由核查功能net.ipv4.conf.default.rp_filter = 1#禁用所有IP源路由net.ipv4.conf.default.accept_source_route = 0#使用sysrq組合鍵是了解系統(tǒng)目前運(yùn)行情況,為安全起見(jiàn)設(shè)為0關(guān)閉kernel.sysrq = 0#控制core文件的文件名是否添加pid作為擴(kuò)展kernel.core_uses_pid = 1#開(kāi)啟SYN Cookies,當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來(lái)處理net.ipv4.tcp_syncookies = 1#每個(gè)消息隊(duì)列的大?。▎挝唬鹤止?jié))限制kernel.msgmnb = 65536#整個(gè)系統(tǒng)最大消息隊(duì)列數(shù)量限制kernel.msgmax = 65536#單個(gè)共享內(nèi)存段的大?。▎挝唬鹤止?jié))限制,計(jì)算公式64G*1024*1024*1024(字節(jié))kernel.shmmax = 68719476736#所有內(nèi)存大?。▎挝唬喉?yè),1頁(yè) = 4Kb),計(jì)算公式16G*1024*1024*1024/4KB(頁(yè))kernel.shmall = 4294967296#timewait的數(shù)量,默認(rèn)是180000net.ipv4.tcp_max_tw_buckets = 6000#開(kāi)啟有選擇的應(yīng)答net.ipv4.tcp_sack = 1#支持更大的TCP窗口. 如果TCP窗口最大超過(guò)65535(64K), 必須設(shè)置該數(shù)值為1net.ipv4.tcp_window_scaling = 1#TCP讀buffernet.ipv4.tcp_rmem = 4096 131072 1048576#TCP寫(xiě)buffernet.ipv4.tcp_wmem = 4096 131072 1048576#為T(mén)CP socket預(yù)留用于發(fā)送緩沖的內(nèi)存默認(rèn)值(單位:字節(jié))net.core.wmem_default = 8388608#為T(mén)CP socket預(yù)留用于發(fā)送緩沖的內(nèi)存最大值(單位:字節(jié))net.core.wmem_max = 16777216#為T(mén)CP socket預(yù)留用于接收緩沖的內(nèi)存默認(rèn)值(單位:字節(jié))net.core.rmem_default = 8388608#為T(mén)CP socket預(yù)留用于接收緩沖的內(nèi)存最大值(單位:字節(jié))net.core.rmem_max = 16777216#每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí),允許送到隊(duì)列的數(shù)據(jù)包的最大數(shù)目net.core.netdev_max_backlog = 262144#web應(yīng)用中l(wèi)isten函數(shù)的backlog默認(rèn)會(huì)給我們內(nèi)核參數(shù)的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認(rèn)為511,所以有必要調(diào)整這個(gè)值net.core.somaxconn = 262144#系統(tǒng)中最多有多少個(gè)TCP套接字不被關(guān)聯(lián)到任何一個(gè)用戶(hù)文件句柄上。這個(gè)限制僅僅是為了防止簡(jiǎn)單的DoS攻擊,不能過(guò)分依靠它或者人為地減小這個(gè)值,更應(yīng)該增加這個(gè)值(如果增加了內(nèi)存之后)net.ipv4.tcp_max_orphans = 3276800#記錄的那些尚未收到客戶(hù)端確認(rèn)信息的連接請(qǐng)求的最大值。對(duì)于有128M內(nèi)存的系統(tǒng)而言,缺省值是1024,小內(nèi)存的系統(tǒng)則是128net.ipv4.tcp_max_syn_backlog = 262144#時(shí)間戳可以避免序列號(hào)的卷繞。一個(gè)1Gbps的鏈路肯定會(huì)遇到以前用過(guò)的序列號(hào)。時(shí)間戳能夠讓內(nèi)核接受這種“異常”的數(shù)據(jù)包。這里需要將其關(guān)掉net.ipv4.tcp_timestamps = 0#為了打開(kāi)對(duì)端的連接,內(nèi)核需要發(fā)送一個(gè)SYN并附帶一個(gè)回應(yīng)前面一個(gè)SYN的ACK。也就是所謂三次握手中的第二次握手。這個(gè)設(shè)置決定了內(nèi)核放棄連接之前發(fā)送SYN+ACK包的數(shù)量net.ipv4.tcp_synack_retries = 1#在內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量net.ipv4.tcp_syn_retries = 1#開(kāi)啟TCP連接中time_wait sockets的快速回收net.ipv4.tcp_tw_recycle = 1#開(kāi)啟TCP連接復(fù)用功能,允許將time_wait sockets重新用于新的TCP連接(主要針對(duì)time_wait連接)net.ipv4.tcp_tw_reuse = 1#1st低于此值,TCP沒(méi)有內(nèi)存壓力,2nd進(jìn)入內(nèi)存壓力階段,3rdTCP拒絕分配socket(單位:內(nèi)存頁(yè))net.ipv4.tcp_mem = 94500000 915000000 927000000#如果套接字由本端要求關(guān)閉,這個(gè)參數(shù)決定了它保持在FIN-WAIT-2狀態(tài)的時(shí)間。對(duì)端可以出錯(cuò)并永遠(yuǎn)不關(guān)閉連接,甚至意外當(dāng)機(jī)。缺省值是60 秒。2.2 內(nèi)核的通常值是180秒,你可以按這個(gè)設(shè)置,但要記住的是,即使你的機(jī)器是一個(gè)輕載的WEB服務(wù)器,也有因?yàn)榇罅康乃捞捉幼侄鴥?nèi)存溢出的風(fēng)險(xiǎn),F(xiàn)IN- WAIT-2的危險(xiǎn)性比FIN-WAIT-1要小,因?yàn)樗疃嘀荒艹缘?.5K內(nèi)存,但是它們的生存期長(zhǎng)些。net.ipv4.tcp_fin_timeout = 15#表示當(dāng)keepalive起用的時(shí)候,TCP發(fā)送keepalive消息的頻度(單位:秒)net.ipv4.tcp_keepalive_time = 30#對(duì)外連接端口范圍net.ipv4.ip_local_port_range = 2048 65000#表示文件句柄的最大數(shù)量fs.file-max = 102400
這是我在實(shí)際生產(chǎn)系統(tǒng)自動(dòng)化部署中用的配置
net.ipv4.ip_forward = 0net.ipv4.conf.default.rp_filter = 1net.ipv4.conf.default.accept_source_route = 0kernel.sysrq = 0kernel.core_uses_pid = 1net.ipv4.tcp_syncookies = 1kernel.msgmnb = 65536kernel.msgmax = 65536kernel.shmmax = 68719476736kernel.shmall = 4294967296net.ipv4.tcp_max_tw_buckets = 6000net.ipv4.tcp_sack = 1net.ipv4.tcp_window_scaling = 1net.ipv4.tcp_wmem = 8192 4336600 873200net.ipv4.tcp_rmem = 32768 4336600 873200net.core.wmem_default = 8388608net.core.rmem_default = 8388608net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.core.netdev_max_backlog = 262144net.core.somaxconn = 262144net.ipv4.tcp_max_orphans = 3276800net.ipv4.tcp_max_syn_backlog = 262144net.ipv4.tcp_timestamps = 1net.ipv4.tcp_synack_retries = 1net.ipv4.tcp_syn_retries = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_mem = 786432 1048576 1572864net.ipv4.tcp_fin_timeout = 30#net.ipv4.tcp_keepalive_time = 30net.ipv4.tcp_keepalive_time = 300net.ipv4.ip_local_port_range = 1024 65000
/sbin/sysctl -p最后記得刷新立即生效
http://serverfault.com/questions/122679/how-do-ulimit-n-and-proc-sys-fs-file-max-differ
新聞熱點(diǎn)
疑難解答
圖片精選