在单个docker容器上运行apachejmeter测试时,我面临以下问题。
[489.013s][warning][os,thread]无法启动线程-属性的pthread_create Failed(EAGAIN(:stacksize:1024k,guardsize:0k,已分离。未捕获异常java.lang.OutOfMemoryError:无法创建本机线程:可能内存不足或达到进程/资源限制。有关详细信息,请参阅日志文件。
我无法生成超过2k并发的Load。即使在同一个docker主机上的分布式模式下,我也很容易实现5k用户的并发。看起来单个docker容器并没有完全利用可用的CPU和内存
以下是配置:
- 服务器的RAM-90GB
- CPU数量-16
- 容器的上限(Ulimit-n(-1048576
- Java-打开jdk-14
- JVM参数--Xms80G-XMX80G
无法创建本机线程
这意味着您不能在操作系统级别上创建超过2000个线程,请检查ulimit -u
和ulimit -T
命令生成的内容,如果您在那里看到大约2000个线程-这是您需要责怪的设置。
此外,对于2000/5000虚拟用户来说,您的堆分配似乎太高了,您不需要将所有物理RAM分配给JVM,您需要调整JVM。
如果Java堆的占用率太高,垃圾回收就会频繁发生。如果占用率低,则垃圾收集不频繁,但持续时间更长。。。尽量将Java堆的内存占用率保持在Java堆大小的40%到70%之间。。。
更多信息:
- 内存不足疑难解答错误:无法创建新的本机线程
- JMeter负载测试"内存不足"故障的9种简单解决方案
- IBM WebSphere Application Server性能食谱-最佳堆大小
- Docker-带有内存、CPU和GPU的运行时选项