背景
1 CentOS 6.x
操作系統:CentOS 6.x
切換到普通用戶的時候報錯:su: 無法設置用戶ID: 資源暫時不可用
今天在使用su切換用戶doiido的的時候,出現了如下報錯:
[root@lmps185 ~]# su - app
su: 無法設置用戶ID: 資源暫時不可用
同時使用SecureCRT等遠程SSH工具均無法使用doiido用戶連接。
查找相關資料,發現是在CentOS 6中,存在/etc/security/limits.d/90-nproc.config文件,此文件限制了普通權限用戶的最大線程數,當此用戶的最大線程數max user processes到達最高限制數,就無法連接登錄。因此在無法減少線程的情況下只能修改此參數,具體修改方法如下:
1 查看max user processes
[root@lmps185 ~]# su - app su: 無法設置用戶ID: 資源暫時不可用
[root@lmps185 ~]# ulimit -u
1024
由此可以看出最大線程數為1024
修改max user processes
1.1 修改90-nproc.conf文件
vim /etc/security/limits.d/90-nproc.conf
[root@lmps185 ~]# vim /etc/security/limits.d/90-nproc.conf
* soft nproc 1024 #所有用戶限制為1024 root soft nproc unlimited #root用戶不限制
修改為
* soft nproc 65535 #所有用戶限制為65535
root soft nproc unlimited #root用戶不限制
備注:也可以設置普通賬號app不受限制
app soft nproc unlimited #app用戶不限制
上面可以看除了root用戶外的所有用戶均限制為1024,因此通過可以注釋此行或者將值改大來解決該問題
修改完成后保存退出,這樣的修改是立馬生效的(經測試成功)
1.2 修改/etc/security/limits.conf文件
vim /etc/security/limits.conf 增加如下內容:所有用戶限制為65535 * soft nproc 65535 * hard nproc 65535 * soft nofile 65535 * hard nofile 65535
也可以直接給對應的應用加,根據個人情況
# cat /etc/security/limits.conf app soft nproc 65535 app hard nproc 65535 app soft nofile 65535 app hard nofile 65535
注:在CentOS 5中無此文件
2 CentOS 7.x
2.1 修改20-nproc.conf文件
centos7.5中配置文件為/etc/security/limits.d/20-nproc.conf。
網上的參考資料中centos6為/etc/security/limits.d/90-nproc.conf這個未驗證。
[sgs@localhost ~]$ sudo vi /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 4096
root soft nproc unlimited
修改4096為10000(所需的值)保存即可。注意需要用戶重新登錄才能生效,這一步網上許多關於修改配置文件的解決方法后都沒提,要注意。
3 Linux 調優方案, 修改最大連接數(ulimit命令)
Linux對於每個用戶,系統限制其最大進程數。為提高性能,可以根據設備資源情況,設置各linux 用戶的最大進程數
可以用ulimit -a 來顯示當前的各種用戶進程限制。
下面我把某linux用戶的最大進程數設為10000個:
ulimit -u 10240
對於需要做許多 socket 連接並使它們處於打開狀態的 Java 應用程序而言,
最好通過使用 ulimit -n xx 修改每個進程可打開的文件數,缺省值是 1024。
ulimit -n 4096 將每個進程可以打開的文件數目加大到4096,缺省為1024
其他建議設置成無限制(unlimited)的一些重要設置是:
數據段長度:ulimit -d unlimited
最大內存大小:ulimit -m unlimited
堆棧大小:ulimit -s unlimited
CPU 時間:ulimit -t unlimited
虛擬內存:ulimit -v unlimited
暫時地,適用於通過 ulimit 命令登錄 shell 會話期間。
永久地,通過將一個相應的 ulimit 語句添加到由登錄 shell 讀取的文件中, 即特定於 shell 的用戶資源文件,如:
3.1 解除 Linux 系統的最大進程數和最大文件打開數限制:
vi /etc/security/limits.conf # 添加如下的行 * soft noproc 11000 * hard noproc 11000 上邊兩行可以用一行代替 * - noproc 11000 -的意思為soft 和hard 全部限制 。 * soft nofile 4100 * hard nofile 4100 說明:* 代表針對所有用戶,noproc 是代表最大進程數,nofile 是代表最大文件打開數
3.2 讓 SSH 接受 Login 程式的登入,方便在 ssh 客戶端查看 ulimit -a 資源限制:
a、vi /etc/ssh/sshd_config
把 UserLogin 的值改為 yes,並把 # 注釋去掉
b、重啟 sshd 服務:
/etc/init.d/sshd restart
3.3 修改所有 linux 用戶的環境變量文件:
vi /etc/profile ulimit -u 10000 ulimit -n 4096 ulimit -d unlimited ulimit -m unlimited ulimit -s unlimited ulimit -t unlimited ulimit -v unlimited 保存后運行#source /etc/profile 使其生效
備注:
有時候在程序里面需要打開多個文件,進行分析,系統一般默認數量是1024,(用ulimit -a可以看到)對於正常使用是夠了,但是對於程序來講,就太少了。
修改2個文件。
1./etc/security/limits.conf
vi /etc/security/limits.conf
加上:
* soft nofile 8192
* hard nofile 20480
2./etc/pam.d/login
session required /lib/security/pam_limits.so
/**********
另外確保/etc/pam.d/system-auth文件有下面內容
session required /lib/security/$ISA/pam_limits.so
這一行確保系統會執行這個限制。
/***********
3.一般用戶的.bash_profile
#ulimit -n 1024
重新登陸ok
3.5 ulimit 的作用
ulimit:顯示(或設置)用戶可以使用的資源的限制(limit),這限制分為軟限制(當前限制)和硬限制(上限),其中硬限制是軟限制的上限值,應用程序在運行過程中使用的系統資源不超過相應的軟限制,任何的超越都導致進程的終止。
參數 描述
ulimited 不限制用戶可以使用的資源,但本設置對可打開的最大文件數(max open files)
和可同時運行的最大進程數(max user processes)無效
-a 列出所有當前資源極限
-c 設置core文件的最大值.單位:blocks
-d 設置一個進程的數據段的最大值.單位:kbytes
-f Shell 創建文件的文件大小的最大值,單位:blocks
-h 指定設置某個給定資源的硬極限。如果用戶擁有 root 用戶權限,可以增大硬極限。任何用戶均可減少硬極限
-l 可以鎖住的物理內存的最大值
-m 可以使用的常駐內存的最大值,單位:kbytes
-n 每個進程可以同時打開的最大文件數
-p 設置管道的最大值,單位為block,1block=512bytes
-s 指定堆棧的最大值:單位:kbytes
-S 指定為給定的資源設置軟極限。軟極限可增大到硬極限的值。如果 -H 和 -S 標志均未指定,極限適用於以上二者
-t 指定每個進程所使用的秒數,單位:seconds
-u 可以運行的最大並發進程數
-v Shell可使用的最大的虛擬內存,單位:kbytes
-x
范例1:
[root@localhost proc]# ulimit -a
core file size (blocks, -c) 100
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
pending signals (-i) 2047
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
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 2047
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@localhost proc]#
輸出的每一行由資源名字、(單位,ulimit命令的參數)、軟限制組成。詳細解釋:
參數 描述
core file size core文件的最大值為100 blocks,
data seg size 進程的數據段可以任意大
file size 文件可以任意大
pending signals 最多有2047個待處理的信號
max locked memory 一個任務鎖住的物理內存的最大值為32kB
max memory size 一個任務的常駐物理內存的最大值
open files 一個任務最多可以同時打開1024的文件
pipe size 管道的最大空間為4096字節
POSIX message queues POSIX的消息隊列的最大值為819200字節
stack size 進程的棧的最大值為8192字節
cpu time 進程使用的CPU時間
max user processes 當前用戶同時打開的進程(包括線程)的最大個數為2047
virtual memory 沒有限制進程的最大地址空間
file locks 所能鎖住的文件的最大個數沒有限制
范例2:通過ulimit命令來限制文件的大小,從而導致拷貝命令的失敗
[root@localhost]ls temp.txt
ls: temp.txt: 沒有那個文件或目錄
[root@localhost]ulimit -f 1 #設置創建文件的最大塊(一塊=512字節)
[root@localhost]cat a.c > temp.txt
文件大小超出限制
文件a.c的大小是5002字節,而我們設定的創建文件的大小是512字節x1塊=512字節