Linux下各種最大數目

ulimit命令查看和更改系統限制

ulimit命令詳解

ulimit用於shell啓動進程所佔用的資源,可以用來設置系統的限制;

語法格式:ulimit [-acdfHlmnpsStvw] [size]

/etc/security/limits.conf文件中定義

這裏寫圖片描述

可以使用ulimit -a查看系統的所有限制

這裏寫圖片描述

Linux大部分的命令設置都是臨時生效的,而且ulimit命令只對當前終端有效。

如果需要永久有效的話,可以:

  • 一種是將命令寫至profile和bashrc中,相當於在登陸時自動動態修改限制;
  • 還有一種就是在/etc/security/limits.conf中添加記錄(需重啓生效,並且在/etc/pam.d/中的seesion有使用到limit模塊);

最大進程數目

Linux中進程的理論最大數計算

每個進程都要在全局段描述表GDT中佔據兩個表項
每個進程的局部段描述表LDT都作爲一個獨立的段而存在,在全局段描述表GDT中要有一個表項指向這個段的起始地址,並說明該段的長度以及其他一些 參數。除上之外,每個進程還有一個TSS結構(任務狀態段)也是一樣。所以,每個進程都要在全局段描述表GDT中佔據兩個表項。

GDT的容量有多大呢?

段寄存器中用作GDT表下標的位段寬爲13位,所以GDT中可以有2^13 = 8192個描述符;

除一些系統的開銷(例如GDT中的第2項和第3項分別用於內核 的代碼段和數據段,第4項和第5項永遠用於當前進程的代碼段和數據段,第1項永遠是0,等等)以外,尚有8180個表項可供使用,所以理論上系統中最大的 進程數量是8180/2=4090。

所以系統中理論上最大的進程數是4090。

系統中可創建的進程數實際值

Linux內核通過進程標識符(process identification value)—PID來標識進程,PID是一個整數,類型爲pid_t,實際上就是int類型。

爲了與老版本的Unix或Linux兼容,PID最大值默認是32768(short int短整型最大值)。

  • 查看
    可以使用cat /proc/sys/kernel/pid_max來查看系統中可創建的進程數實際值
  • 修改
    ulimit -u 65535

設置完之後,雖然我們設置創建進程數的硬限制和軟限制都是65535,但還是不能創建65535個進程,需要在Linux設置內核參數kernel.pid_max,這個參數默認安裝都是32768,所以即便是root用戶,卻不設置這個內核參數,整個系統最多可創建進程數就是32768,所以,需進行如下設置:
sysctl -w kernel.pid_max=65535

最大線程數

Linux系統中單個進程的最大線程數有其最大限制:PTHREAD_THREADS_MAX

這個限制可以在/usr/include/bits/local_lim.h中查看,對linuxthreads這個值一般是1024,對於nptl沒有硬性的限制,僅僅受限於系統的資源,系統的資源主要就是線程的stack所佔用的內存,用ulimit -s可以查看默認的線程棧的大小,一般情況下,這個值是8M = 8192KB。

Linux中單個進程理論上可以創建的最大線程數

在我們的系統(Ubuntu-14.04-LTS-64bit)中linuxthreads 上最多可以創建 381 個線程,之後就會返回 EAGAIN,而32爲系統中,可以創建381個線程,這個值和理論完全符合,因爲32位Linux下的用戶進程空間是3G大小,也就是3072M,3072 / 8 = 384,但是實際上代碼段和數據段還要佔用一些空間,這個值應該向下取整到383,再減去主線程,得到382,那麼爲什麼linuxthreads上還要少一個線程呢?因爲linuxthreads還需要一個 管理線程

爲了突破內存的額限制,可以有兩種方法:

  • ulimit -s 1024減小默認的棧大小;
  • 調用pthread_create的時候用pthread_attr_getstacksize設置一個較小的棧大小;

要注意,即使這樣的也無法突破1024個線程的硬限制,除非重新編譯C庫。

最大打開文件數

file-max系統最大打開文件描述符數

/proc/sys/fs/file-max中指定了系統範圍內所有進程可打開的文件句柄的數量限制(系統級別, kernel-level)。

The value in file-max denotes the maximum number of file handles that the Linux kernel will allocate).

當收到”Too many open files in system”這樣的錯誤消息時, 就應該增加這個值了。

對於2.2的內核, 還需要考慮inode-max, 一般inode-max設置爲file-max的4倍. 對於2.4及以後的內核, 沒有inode-max這個文件了。

查看實際值

可以使用cat /proc/sys/fs/file-max來查看當前系統中單進程可打開的文件描述符數目

這裏寫圖片描述

設置

  • 臨時性設置:echo 1000000 > /proc/sys/fs/file-max
  • 永久性設置:在/etc/sysctl.conf中設置fs.file-max = 1000000

nr_open是單個進程可分配的最大文件數

內核支持的最大file handle數量,即一個進程最多使用的file handle數

A process cannot use more than NR_OPEN file descriptors.
一個進程不能使用超過NR_OPEN文件描述符

這裏寫圖片描述

nofile進程最大打開文件描述符數

ulimit -n

這裏寫圖片描述

默認查看的是軟資源限制值soft limit,如果想要查看系統硬件所能支持的單進程最大打開文件描述符號的數目,可以使用ulimit -Hn

這裏寫圖片描述

設置
  • 臨時性:

通過ulimit -Sn設置最大打開文件描述符數的soft limit,注意soft limit不能大於hard limit(ulimit -Hn可查看hard limit);

另外ulimit -n默認查看的是soft limit,但是ulimit -n 1800000則是同時設置soft limit和hard limit;

對於非root用戶只能設置比原來小的hard limit;

  • 永久性:

上面的方法只是臨時性的,註銷重新登錄就失效了,而且不能增大hard limit,只能在hard limit範圍內修改soft limit;

若要使修改永久有效,則需要在/etc/security/limits.conf中進行設置(需要root權限),可添加如下兩行,表示用戶chanon最大打開文件描述符數的soft limit爲1800000,hard limit爲2000000。以下設置需要註銷之後重新登錄才能生效:

chanon           soft    nofile         102400
chanon           hard    nofile          409600

設置nofile的hard limit還有一點要注意的就是hard limit不能大於/proc/sys/fs/nr_open,假如hard limit大於nr_open,註銷後無法正常登錄。

file-max是內核可分配的最大文件數,nr_open是單個進程可分配的最大文件數,所以在我們使用ulimit或limits.conf來設置時,如果要超過默認的1048576值時需要先增大nr_open值(sysctl -w fs.nr_open=100000000或者直接寫入sysctl.conf文件)。

  • 所有進程打開的文件描述符數不能超過/proc/sys/fs/file-max;
  • 單個進程打開的文件描述符數不能超過user limit中nofile的soft limit;
  • nofile的soft limit不能超過其hard limit;
  • nofile的hard limit不能超過/proc/sys/fs/nr_open(單個進程可分配的最大文件數);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章