Linux 文件句柄导致系统压力测试时出现错误率

最近,在对一个golang写的获取商品详情信息的接口做压力测试时,tps 单机可以达到1400多,但是发现每当压力测试开始2分钟多时就会出现502或504 错误,整体的错误率在0.5%左右。一开始是怀疑代码写的效率不高,是不是协程开多了或者是有锁占用了。对代码做了一次次的桌前检查,认为不是代码的问题,怀疑是服务器文件句柄开的过低,紧接着就是一波一波的排查。

Linux操作系统中文件句柄数的限制默认是1024(一个进程最多可以接受1024个socket连接),在生产环境系统中这是远远不够的,所以很多应用都需要解除文件句柄数的限制。

通过调用ulimit命令可以看到一个进程能够打开的最大文件句柄数量:
Linux中所有的事物或资源都是以文件的形式存在,比如消息、共享内存、连接等,句柄可以理解为指向这些文件的指针。

对于这些句柄,Linux是有数量限制的,单个进程默认可以打开的句柄数上限,可以用以下命令来查看:

$ ulimit -a

在这里插入图片描述

查看某个进程的句柄数上限,命令是:

$ ulimit -a PID
在这里插入图片描述

单个进程句柄数的修改(系统重启后会恢复默认值)

$ ulimit -n 句柄数
永久修改单个进程句柄数

$ cat >> /etc/security/limits.conf << EOF * soft nofile 102400 * hard nofile 102400 EOF

说明:修改完成后,需要重新打开终端,使用 ulimit -a 查看句柄数

查询系统中指定进程占用的句柄数

$ lsof -n | grep [PID|进程名]| wc -l
查询系系统中进程占用的句柄数

$ lsof -n | awk ‘{print $2}’ | sort | uniq -c | sort -nr | more
文件类型有以下几种:
DIR:表示目录。
CHR:表示字符类型。
BLK:块设备类型。
UNIX: UNIX 域套接字。
FIFO:先进先出 (FIFO) 队列。
IPv4:网际协议 (IP) 套接字。

LINUX对能够打开的文件句柄的数量做了限制。限制是分为三个层面:系统层面,用户层面和进程层面。
如果某个进程打开的文件句柄超过限制,再打开文件就会报错。因此,在编程时,如果进程要占用大量文件句柄的话,
就要看看是否要调整最大可打开的文件句柄数,同时也要注意close释放掉不用的文件句柄。

系统层面

$ cat /proc/sys/fs/file-max
用户层面

$ ulimit -n
进程层面

$ cat /proc/PID/limits

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科比不来it

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值