文章目录
- Pre
- (内核、用户、进程)句柄数设置
- 问题 shell
- 修复
Pre
Linux - 深入理解/proc虚拟文件系统:从基础到高级
(内核、用户、进程)句柄数设置
在Linux系统中,进程打开的最大句柄数可以通过多种方式配置,涉及不同的层次和持久性:
-
临时调整:
- 使用
ulimit
命令可以在当前shell会话中临时调整用户进程的打开文件描述符的软限制(soft limit)。例如:ulimit -n 65536
- 若要调整硬限制(hard limit),需要超级用户权限:
sudo ulimit -Hn 65536
- 使用
-
永久性调整:
- /etc/security/limits.conf:这个文件可以用来永久性地设置用户和组的资源限制,包括打开的文件描述符数。格式如下:
其中* soft nofile 65536 * hard nofile 65536
*
表示所有用户,可以替换为具体的用户名或用户组。soft
和hard
分别表示软限制和硬限制。
- /etc/security/limits.conf:这个文件可以用来永久性地设置用户和组的资源限制,包括打开的文件描述符数。格式如下:
- 系统全局限制:
- /proc/sys/fs/file-max:这个文件反映了系统全局可打开的文件描述符总数。调整这个值需要修改内核参数,通常需要重启系统才能生效。在
/etc/sysctl.conf
中添加以下行可以实现:
然后运行fs.file-max = 6553560
sysctl -p
使更改生效,或者在系统启动时自动应用。
- /proc/sys/fs/file-max:这个文件反映了系统全局可打开的文件描述符总数。调整这个值需要修改内核参数,通常需要重启系统才能生效。在
请记住,修改这些设置可能会影响系统性能和稳定性,特别是在提高限制时,可能会消耗更多的系统资源。因此,在进行任何更改之前,最好先评估其影响,并确保有足够的资源来支持增加的句柄数。
问题 shell
#!/bin/bash
source /etc/profile
CURPATH=$(cd "$(dirname "$0")";pwd)
JVM=$(cat $CURPATH/xxx.ini)artisanProcess="$CURPATH/artisan.jar"# now set the path to java
# [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
# [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
# [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/appstore/programfiles/mbws_jdk
# [ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOMEsource /xxxx/xxxjdk.option
COMMON_JVM=$(cat /axxxx/xdded.option)if [ -f $JAVA/bin/java ];thenexport JAVA_HOME=$JAVAexport PATH=$JAVA_HOME/bin:$PATH
fiif [ -z "$JAVA_HOME" ]; thenJAVA_PATH=`dirname $(readlink -f $(which java))`if [ "x$JAVA_PATH" != "x" ]; thenexport JAVA_HOME=`dirname $JAVA_PATH 2>/dev/null`fiif [ -z "$JAVA_HOME" ]; thenerror_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better!"exit 1fi
fiwhile [ 1 -eq 1 ]
doAdminProcNum=`ps -ef | grep $rpcProcess | grep -v grep | wc -l`echo "AdminProcNum:"$AdminProcNumif [ $AdminProcNum -lt 1 ]thencd $CURPATHsudo sysctl -w fs.file-max=999999sudo sysctl -w net.ipv4.tcp_tw_reuse=1sudo sysctl -w net.ipv4.tcp_fin_timeout=15sudo sysctl -w net.core.netdev_max_backlog=4096sudo sysctl -w net.core.somaxconn=40960sudo sysctl -w net.ipv4.tcp_max_syn_backlog=40960sudo sysctl -w net.ipv4.tcp_syncookies=1sudo sysctl -w net.ipv4.tcp_syn_retries=2sudo sysctl -w net.ipv4.tcp_synack_retries=2sudo ulimit -u 999999sudo ulimit -n 999999nohup $JAVA/bin/java $JVM $COMMON_JVM -jar $artisanProcess > /dev/null 2>&1 &cho $! > $CURPATH/tpidcd -fisleep 10
done
为了至此降权操作,增加了sudo
sudo sysctl -w fs.file-max=999999sudo sysctl -w net.ipv4.tcp_tw_reuse=1sudo sysctl -w net.ipv4.tcp_fin_timeout=15sudo sysctl -w net.core.netdev_max_backlog=4096sudo sysctl -w net.core.somaxconn=40960sudo sysctl -w net.ipv4.tcp_max_syn_backlog=40960sudo sysctl -w net.ipv4.tcp_syncookies=1sudo sysctl -w net.ipv4.tcp_syn_retries=2sudo sysctl -w net.ipv4.tcp_synack_retries=2sudo ulimit -u 999999sudo ulimit -n 999999
导致ulimit -n 999999
不生效
cat /proc/$pid/limits
修复
方式一: 去掉sudo
方式二: 如下
对于系统服务,特别是使用 Systemd 的系统,还可以在服务单元文件(位于 /etc/systemd/system/ 或 /lib/systemd/system/)中通过 LimitNOFILE= 设置最大打开文件数。例如:
[Service]
LimitNOFILE=999999
修改配置文件后,可能需要重启相关服务或用户会话使设置生效。如果是修改了 /etc/security/limits.conf
,通常需要用户重新登录才能看到变化。对于 Systemd 管理的服务,则需执行 systemctl daemon-reload
后重启服务。