记录文件描述符达到上限问题解决

1)先看系统的

复制代码
[root@huawei-sh1-3-gywzsbcslmzdsxsj-game-1 ~]# ulimit -n
65535   

疑问: 看着这个值是65535啊,但是依然连不上了

2)问了下豆包

3)那就查询下

复制代码
[root@huawei-sh1-3-gywzsbcslmzdsxsj-game-1 ~]# jps
12145 Jps
15603 nacos-server.jar
8979 server.jar
8627 server.jar
9421 server.jar
[root@huawei-sh1-3-gywzsbcslmzdsxsj-game-1 ~]# cat /proc/8979/limits | grep "Max open files"
Max open files            4096                 4096                 files     
[root@huawei-sh1-3-gywzsbcslmzdsxsj-game-1 ~]# cat /proc/8627/limits | grep "Max open files"
Max open files            4096                 4096                 files     
[root@huawei-sh1-3-gywzsbcslmzdsxsj-game-1 ~]# cat /proc/9421/limits | grep "Max open files"
Max open files            4096                 4096                 files     

果然是: 4096

4)调整配置

vim /etc/systemd/system.conf

复制代码
DefaultLimitNOFILE=1048576
#DefaultLimitAS=
DefaultLimitNPROC=1048576

vim /etc/sysctl.conf

复制代码
# ========== 文件描述符核心配置(必须加,匹配systemd的1048576) ==========
# 系统全局最大可打开的文件描述符总数(给1000万,冗余拉满,支撑高并发)
fs.file-max = 10000000
# 单个进程最大可打开的文件描述符硬上限(必须 >= systemd的DefaultLimitNOFILE=1048576)
fs.nr_open = 2000000

# ========== TCP 高并发优化(游戏服务器必加,解决连接瓶颈) ==========
# 调整TCP连接队列上限,解决高并发下连接拒绝
net.core.somaxconn = 65535
# 半连接队列上限,应对SYN Flood攻击,提升并发
net.ipv4.tcp_max_syn_backlog = 65535
# TIME_WAIT状态连接的最大数量,避免短时间大量连接占满端口
net.ipv4.tcp_max_tw_buckets = 2000000
# 允许TIME_WAIT状态的端口被快速复用,解决端口耗尽问题
net.ipv4.tcp_tw_reuse = 1
# 开启TCP时间戳,tw_reuse依赖此参数
net.ipv4.tcp_timestamps = 1
# 调整TCP keepalive参数,快速回收死连接,释放FD
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3

# ========== 内存优化(你已经有了,这里补充完整) ==========
# 关闭swap,避免内存交换导致服务卡顿(你已经配置了vm.swappiness=0,保留即可)
vm.swappiness=0

vim /etc/security/limits.conf

复制代码
root soft nofile 1048576
root hard nofile 1048576
* soft nofile 1048576
* hard nofile 1048576

5)生效

复制代码
sysctl -p

systemctl daemon-reexec

6)退出回话重新登录验证

复制代码
cat /proc/self/limits

ulimit -n

systemctl show --property DefaultLimitNOFILE

systemctl show --property DefaultLimitNPROC

7)验证java进程最大句柄数

复制代码
for pid in $(pidof java); do echo "PID: $pid"; cat /proc/$pid/limits | grep "Max open files"; done

可见,除了nacos没重启,其它的java进程都改为100W了

PID: 15603

Max open files 4096 4096 files

PID: 8357

Max open files 1048576 1048576 files

PID: 7897

Max open files 1048576 1048576 files

PID: 7531

Max open files 1048576 1048576 files

8)查看当每个java进程句柄占用数

复制代码
for pid in $(jps -q); do
echo -n "PID $pid: "
ls /proc/$pid/fd 2>/dev/null | wc -l
done
相关推荐
2601_949539452 小时前
15万级家用混动SUV电池与续航技术入门科普
运维·网络
呱呱巨基2 小时前
网络基础概念
linux·网络·c++·笔记·学习
薛定谔的悦3 小时前
BMS Modbus RTU实现:从帧结构到寄存器映射的完整工程
linux·数据库·bms
cui_ruicheng3 小时前
Linux进程控制(下):实现简易 Shell 命令行解释器
linux·运维·服务器
Smile_2542204183 小时前
clickhouse日志疯涨问题
linux·运维·服务器·clickhouse
2301_旺仔3 小时前
【Nginx进程管理】
linux·服务器·网络
SPC的存折3 小时前
(自用)LNMP-Redis-Discuz5.0部署指南-openEuler24.03-测试环境
linux·运维·服务器·数据库·redis·缓存
舒一笑3 小时前
Docker Compose 挂载 Nginx 配置的正确姿势(90%的人都踩过这个坑)
运维·docker·容器
W.W.H.3 小时前
嵌入式常见面试题——操作系统与RTOS篇
linux·经验分享·操作系统·rtos