压力测试Exception:Too many open files.

本文介绍了在进行大并发压力测试时遇到Too many open files异常的原因及解决方法。通过调整Linux和Windows系统的文件描述符限制与TCP参数,提高系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当进行大并发的压力测试时,经常会出现如下Exception:Too many open files.
查阅资料,google baidu.
首先感谢demo的评论,使我对这个问题有了新的认识。
经过再次查找,发现这个问题的出现原因是system对打开files数量的限制问题。
用 ulimit -a 命令可以查看当前所有资源限制
fingki@ubuntu:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15863
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
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15863
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
fingki@ubuntu:~$
可以看出,对open files的限制数是1024,我们可以通过修改这个值来增加可以打开的文件数。
最简单的修改方式就是用ulimit -n 命令,
比如我打算将其改为2048,用 ulimit -n 2048.
当你把open files的值增大到一定程度,你的Too many open files就不会再出现了。

而对于tcp_fin_timeout,是合tcp连接相关的,当你有大量tcp连接时,或许有些性能改善;
tcp_fin_timeout,默认情况下,win为4 min,linux为60 sec.
可以把其相应设置短一些,以增加系统性能。

in Windows
  1. Run regedit to start the Registry Editor
  2. Locate the following key: HKEY_LOCAL_MACHINE"System"CurrentControlSet"Services"tcpip"Parameters
  3. Add a new value named TcpTimedWaitDelay asa decimal and set the desired timeout in seconds (30-300)
  4. Reboot
in Linux
  1. Update the configuration value by running (30 seconds used in the example)
    echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
  2. Restart the networking component, for example by running
    /etc/init.d/networking restart  or  service network restart

在linux下,经常会有权限问题使设置不能成功,尽管你用了sudo。
解决办法就是先 su root,在root用户下来执行操作,这样就ok了。
再有就是可能忘记root密码了,那就 sudo passwd root,来设置一个新密码。

根据进一步的研究发现:服务器默认情况下对进程的处理也是有限制的,要想server处理更多用户进程就需要调整相应参数。
这里面有两个文件要特别注意,
一个是    /etc/security/limits.conf
另一个    /etc/sysctl.conf

当我们用ulimit -a命令可以查看 open files(默认为1024)和max user processes(默认也为1024),
所以默认情况下这个server只允许同时打开1024个文件,处理1024个用户进程,
若要 临时 改变这两个参数值,可以使用 ulimit -n 10240 ,ulimit -u 10240,
若要 长久 改变这两个参数值,就要修改/ect/security/limits.conf,在文件中加上两行:
* - nofile 102400
* - nproc 102400

而对于大量使用tcp连接的应用来说,也需要对/etc/sysctl.conf中的参数进行相应优化:
net/ipv4/ip_always_defrag = 1
net.ipv4.ip_local_port_range = 1024    65000
net.ipv4.tcp_max_syn_backlog = 102400
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
上面是我根据我的需求的一些参数调整,你可以根据你的需求来调整相应参数值。
然后执行 sysctl -p命令可立即生效。sysctl -a可查看参数值。

参考 :http://www.iteye.com/topic/65175

### Hutool库中因文件描述符过多导致的HttpException问题分析与解决方案 在使用Hutool库时,如果遇到`cn.hutool.http.HttpException: Too many open files`的问题,通常是因为系统资源(如文件描述符)被过度占用或未正确释放。以下是对此问题的详细分析和解决方案。 #### 1. 问题原因 文件描述符是操作系统为每个打开的文件、套接字或其他I/O资源分配的一个整数值。当程序频繁地创建HTTP连接且未正确关闭时,会导致文件描述符耗尽。Hutool库中的`cn.hutool.http.HttpRequest`类在执行HTTP请求时会创建网络连接,若未显式关闭这些连接,就会引`Too many open files`异常[^1]。 #### 2. 解决方案 ##### 2.1 确保正确关闭HTTP连接 在使用Hutool库进行HTTP请求时,必须确保每次请求完成后都正确关闭连接。可以通过调用`execute()`方法后的`close()`方法来释放资源。例如: ```java import cn.hutool.http.HttpRequest; public class HttpExample { public static void main(String[] args) { try { // 起GET请求 String result = HttpRequest.get("http://example.com") .execute() .body(); // 获取响应体 System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } } ``` 注意:`execute()`返回的对象需要手动关闭以释放资源[^2]。 ##### 2.2 使用连接池优化资源管理 Hutool支持通过Apache HttpClient实现连接池管理。启用连接池可以复用HTTP连接,减少频繁创建和销毁连接带来的资源消耗。配置连接池的方法如下: ```java import cn.hutool.http.HttpGlobalConfig; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; public class ConnectionPoolConfig { public static void main(String[] args) { PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); connectionManager.setMaxTotal(200); // 设置最大连接数 connectionManager.setDefaultMaxPerRoute(50); // 设置每个路由的最大连接数 HttpGlobalConfig.setConnectionManager(connectionManager); System.out.println("连接池已配置完成"); } } ``` 通过上述配置,可以有效减少文件描述符的占用[^3]。 ##### 2.3 增加操作系统的文件描述符限制 如果程序运行环境中默认的文件描述符限制较低,也可能导致`Too many open files`问题。可以通过以下方式调整操作系统的文件描述符限制: - **临时调整**:在Linux系统中,执行以下命令以增加当前用户的文件描述符限制: ```bash ulimit -n 65535 ``` - **永久调整**:编辑`/etc/security/limits.conf`文件,添加以下内容: ``` * soft nofile 65535 * hard nofile 65535 ``` 调整后需重启系统或重新登录以使更改生效[^4]。 #### 3. 监控与调试 为了更好地定位问题,可以在程序中加入监控逻辑,定期检查文件描述符的使用情况。例如,使用`lsof`命令查看当前进程打开的文件数量: ```bash lsof -p <PID> | wc -l ``` 其中,`<PID>`为程序的进程ID。如果现文件描述符数量持续增长,则说明可能存在资源泄漏问题[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值