我玩弄的JVM(甲骨文1.7 64位)在Linux机器上(AMD 6核心,16 GB RAM)看到线程的应用程序的数量如何影响系统性能.我希望测量上下文切换会降低性能.
我创建了一个创建线程执行池的小应用程序:
Executors.newFixedThreadPool(numThreads)
Run Code Online (Sandbox Code Playgroud)
我numThreads每次运行程序时都会调整,以查看它的效果.
然后我将numThread工作(实例java.util.concurrent.Callable)提交到池中.每一个增加一个AtomicInteger,做一些工作(创建一个随机整数数组并将其洗牌),然后睡一会儿.我们的想法是模拟Web服务调用.最后,作业重新提交给池,以便我总是有numThreads工作.
我正在测量吞吐量,就像每分钟处理的作业数一样.
有几千个线程,我每分钟可以处理多达400,000个工作.超过8000个线程,结果开始变化很大,这表明上下文切换正成为一个问题.但我可以继续将线程数增加到30,000,并且仍然可以获得更高的吞吐量(每分钟420,000到570,000个作业).
现在的问题是:我获得了java.lang.OutOfMemoryError: Unable to create new native thread超过31,000个工作岗位.我试过设置-Xmx6000M没有帮助.我试过玩,-Xss但这也无济于事.
我读过这ulimit可能很有用,但增加ulimit -u 64000并没有改变任何东西.
有关信息:
[root@apollo ant]# 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) 127557
max locked memory (kbytes, -l) 64
max memory size …Run Code Online (Sandbox Code Playgroud)