limit-進程句柄限制


 

 

 

在Linux下面部署應用的時候,有時候會遇上Socket/File: Can’t open so many files的問題,比如還有Squid做代理,當文件打開數到900多時速能就非常快的下降,有可能打不開網頁.

Linux是有文件句柄限制的,而且Linux默認不是很高,一般都是1024,生產服務器用其實很容易就達到這個數量.
查看方法
我們可以用ulimit -a來查看所有限制值
[root@centos5 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
max nice                        (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 4096
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
max rt priority                 (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited||<
其中 "open files (-n) 1024 "是Linux操作系統對一個進程打開的文件句柄數量的限制(也包含打開的SOCKET數量,可影響MySQL的並發連接數目).這個值可用ulimit 命令來修改,但ulimit命令修改的數值只對當前登錄用戶的目前使用環境有效,系統重啟或者用戶退出后就會失效.
系統總限制是在這里,/proc/sys/fs/file-max.可以通過cat查看目前的值,修改/etc/sysctl.conf 中也可以控制.
另外還有一個,/proc/sys/fs/file-nr,可以看到整個系統目前使用的文件句柄數量
查找文件句柄問題的時候,還有一個很實用的程序lsof.可以很方便看到某個進程開了那些句柄.也可以看到某個文件/目錄被什么進程占用了.
修改方法
若要令修改ulimits的數值永久生效,則必須修改配置文檔,可以給ulimit修改命令放入/etc/profile里面,這個方法實在是不方便,還 有一個方法是修改/etc/sysctl.conf .我修改了,測試過,但對用戶的ulimits -a 是不會改變的。只是/proc/sys/fs/file-max的值變了.(我給命令放到rc.local中失敗)
我認為正確的做法,應該是修改/etc/security/limits.conf
里面有很詳細的注釋,比如:
* soft nofile 32768
* hard nofile 65536
也可以直接運行下面這個shell。直接copy到你的終端中運行就好了.
echo -ne "
* soft nofile 65536
* hard nofile 65536
" >>/etc/security/limits.conf
就可以將文件句柄限制統一改成軟32768,硬65536.配置文件最前面的是指domain,設置為星號代表全局,另外你也可以針對不同的用戶做出不同的限制
注意.這個當中的硬限制是實際的限制,而軟限制,是warnning限制,只會做出warning.其實ulimit命令本身就有分軟硬設置,加-H就是硬,加-S就是軟
默認顯示的是軟限制,如果運行ulimit命令修改的時候沒有加上的話,就是兩個參數一起改變.
生效
修改完重新登錄就可以見到.(我的系統是Centos5.1.修改了,重新登錄后就立刻生效.可以用ulimit -a 查看確認.)
 
 
limits.conf的工作原理:
  limits.conf的后端是這樣工作的:limits.conf是pam_limits.so的配置文件,然后/etc/pam.d/下的應用程 序調用pam_***.so模塊。譬如說,當用戶訪問服務器,服務程序將請求發送到PAM模塊,PAM模塊根據服務名稱在/etc/pam.d目錄下選擇 一個對應的服務文件,然后根據服務文件的內容選擇具體的PAM模塊進行處理。
  例:限制admin用戶登錄到sshd的服務不能超過2個
  在/etc/pam.d/sshd 中添加 session required pam_limits.so
  在/etc/security/limits.conf中添加 admin - maxlogins 2
  查看應用程序能否被PAM支持,用ldd
  limits.conf文件的參數
  Limits.conf文件的參數可以設置成以下兩種形式之一:
  暫時地,適用於通過 ulimit 命令登錄 shell 會話期間。
  永久地,通過將一個相應的 ulimit 語句添加到由登錄 shell 讀取的文件之一(例如 ~/.profile),即特定於 shell 的用戶資源文件;或者通過編輯 /etc/security/limits.conf。
  1.core - 限制內核文件的大小
  何謂core文件,當一個程序崩潰時,在進程當前工作目錄的core文件中復制了該進程的存儲圖像。core文件僅僅是一個內存映象(同時加上調試信息),主要是用來調試的。 core文件是個二進制文件,需要用相應的工具來分析程序崩潰時的內存映像。
  系統默認core文件的大小為0,所以沒有創建。可以用ulimit命令查看和修改core文件的大小。
  
  $ulimit -c
  0
  $ ulimit -c 1000
  $ ulimit -c
  1000
  -c 指定修改core文件的大小,1000指定了core文件大小。也可以對core文件的大小不做限制,如:
  
  # ulimit -c unlimited
  #ulimit -c
  unlimited
  如果想讓修改永久生效,則需要修改配置文件,如 .bash_profile、/etc/profile或/etc/security/limits.conf。
  2.nofile - 打開文件的最大數目
  對於需要做許多套接字連接並使它們處於打開狀態的應用程序而言,最好通過使用 ulimit –n,或者通過設置nofile 參數,為用戶把文件描述符的數量設置得比默認值高一些。

 

Linux---進程句柄限制總結

 

受網上很多帖子影響,一直認為Unix、Linux下單個進程打開句柄數目上限是65535,不能超過這個值,最近從網上看到另一種描述,在SUSE、RedHat都測試了一下,單個進程完全可以支持到100萬以上的句柄。

關於系統文件句柄的幾個限制從大往小排列:

/proc/sys/fs/nr_open

系統文件系統支持文件句柄總數上限,默認值1048576(1M),Linux2.6.25開始增加該內核參數,用於替換內核宏NR_OPEN(1048576),該值上限受限於系統內存。

在linux 2.26.32平台執行“man 5 proc”沒有看到“/proc/sys/fs/nr_open”,只看到NR_OPEN參數限制/proc/sys/fs/file-max。

/proc/sys/fs/file-max

系統文件系統支持文件句柄總數最大值,必須小於/proc/sys/fs/nr_open或NR_OPEN,增加該值時,必須同步修改/proc/sys/fs/inode-max = 4*/proc/sys/fs/file-max。

ulimit -Hn

單個進程句柄數硬上限,默認值1024,不能大於/proc/sys/fs/file-max,修改方法不多講。

ulimit -Hn

單個進程句柄數軟上限,默認值1024,不能大於“ulimit -Hn”硬上限,修改方法不多講。

FD_SETSIZE

Linux環境一個C語言的宏定義,在/usr/include/bits/typesize.h或有定義,默認值1024,到目前為止,我只確認該宏定義限制FD_SET()、FD_CLR()操作的文件描述符值,猜測應該是Linux早期版本遺留下來的一個限制。既然select()操作已經淘汰了,這個宏定義應該也沒用了。如果要使用select()系列操作,可以在gcc編譯時定義該宏“-DFD_SETSIZE=65535”。

手工修改操作系統句柄,請按照下表修改配置:

操作系統

查看句柄數方法

修改句柄數方法

Linux

ulimit -Sn   

---查看句柄數軟限制

ulimit -Hn   

---查看句柄數硬限制

檢查/etc/security/limits.conf文件,修改或增加如下配置:

*                hard    nofile          65536

*                soft    nofile          65535

在/etc/pam.d/su、/etc/pam.d/xdm、/etc/pam.d/login文件增加如下配置:

session  required      pam_limits.so

HP

kctune -q maxfiles

---查看句柄數軟限制

kctune -q maxfiles_lim

---查看句柄數硬限制

執行命令修改:

kctune maxfiles>=XXX

XXX范圍【32,maxfiles_lim】,maxfiles_lim的取值范圍【32,1048576】,但是大於65535時,某些老版本的文件函數不兼容。

maxfiles修改后,必須重啟操作系統生效。

Aix

ulimit -Sn   

---查看句柄數軟限制

ulimit -Hn   

---查看句柄數硬限制

檢查/etc/security/limits文件,增加修改如下配置:

nofiles = -1

nofiles_hard=-1

在AIX6測試驗證:即使配置為ulimited,單個進程只能打開65535個句柄。

Solaris

ulimit -Sn   

---查看句柄數軟限制

ulimit -Hn   

---查看句柄數硬限制

檢查/etc/system文件,增加修改如下配置:

rlim_fd_max=65535

rlim_fd_cur=65535

修改后,需要重啟機器生效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM