Java线程无法执行-CPU使用率低,但IO等待时间长

Java线程无法执行-CPU使用率低,但IO等待时间长,java,linux,multithreading,preemptive,Java,Linux,Multithreading,Preemptive,Ubuntu 12.04 LTS java-版本 java版本“1.6.0_38” Java(TM)SE运行时环境(build 1.6.0_38-b05) Java HotSpot(TM)64位服务器虚拟机(构建20.13-b02,混合模式) 4核CPU-一些Dell服务器硬件 10个线程有时会在几分钟内运行一个“繁重”的作业。在其他时期,他们什么也不做。 一个线程应该每5秒(大约5秒)唤醒一次,并通过网络向另一个进程发送一个快速ping。只要其他10个线程什么也不做,这就可以很好地工作,但是当

Ubuntu 12.04 LTS

java-版本
java版本“1.6.0_38”
Java(TM)SE运行时环境(build 1.6.0_38-b05)
Java HotSpot(TM)64位服务器虚拟机(构建20.13-b02,混合模式)

4核CPU-一些Dell服务器硬件

10个线程有时会在几分钟内运行一个“繁重”的作业。在其他时期,他们什么也不做。
一个线程应该每5秒(大约5秒)唤醒一次,并通过网络向另一个进程发送一个快速ping。只要其他10个线程什么也不做,这就可以很好地工作,但是当其他10个线程运行一个“繁重”的作业时,它就永远不会(或者很少)运行并发送ping

如果这项“繁重”的工作是CPU密集型的,我可以理解这一点。但在这样一个“繁重”的工作中,top表示有50-100%的IO等待,但CPU使用率约为1%。分析表明,到目前为止,这10个线程花费的大部分时间都花在(我想是等待)某个NIO调用上。所有这些加起来都是意料之中的,因为这项工作的重担是从磁盘读取文件

我不明白的是,在这样一个“繁重”的工作中,执行ping的1线程无法运行。当top显示1%的CPU使用率,并且10个线程的大部分时间似乎都在等待IO时,如何解释这一点。当其他线程正在等待IO时,1ping线程不应该获得执行时间吗

Java线程优先级在所有11个线程上相等

在10个线程中分散一些收益率似乎可以解决(或降低)这个问题,但我不明白为什么ping线程在没有收益率的情况下不能运行,而其他线程只等待IO

附加信息2014年3月5日

我已经在一个更简单的设置中重现了这个问题——尽管还不是很简单(您必须了解如何安装Apache Zookeeper服务器,但它相当简单——我可以稍后提供信息)

在这里找到Eclipse开普勒项目(maven-buildby“mvn包”):
在此处查找二进制文件:

在机器上启动Apache ZooKeeper 3.4.5(在端口2181上)服务器。在另一台单独的机器上(这里有Ubuntu 12.04 LTS等,如上所述)按如下方式运行二进制文件(首先创建一个io测试文件文件夹-需要50GB的空间)

首先,它创建10个5GB文件(50GB比机器RAM大得多,所以操作系统文件缓存没有多大帮助),然后启动ZooKeeper客户端(应该通过定期发送ping/心跳来保持与ZooKeeper服务器的连接),然后让10个线程随机访问10个文件,从而创建大量磁盘IO,但实际上没有真正使用CPU。我看到ZooKeeper客户端最终失去了它的连接(“Zk状态”-在stdouterr.txt中停止说“已连接”),这基本上是我不理解的。ZooKeeper客户端线程只想发送一个相隔几秒的微小心跳信号,只有在20秒内无法发送时,它才会失去连接。我希望它能够轻松访问CPU,因为所有其他线程基本上只等待磁盘IO。

在测试过程中,我使用“top”看到以下内容

  • 非常高的“平均负载”。上面10个我不理解,因为基本上只有10个线程在做一些事情。我还认为“平均负载”只计算那些实际上想在CPU上做真正事情的线程(不包括IO的等待),但是根据http://en.wikipedia.org/wiki/Load_%28computing%29 Linux还统计“不间断睡眠”,包括等待IO的线程。但我真的不希望/认为它会阻止其他有真正的事情要做的线程获得CPU
  • 非常高的%wa,但CPU上几乎没有%sy和%us

下面是我的一次运行的输出:

这是一个非常通用的问题,没有任何代码示例。你能重现这个问题让我们看看吗?是的,请回答@GiovanniBotta所说的(:这个问题听起来像“它不起作用,告诉我为什么?”当你使用线程时,你可能会遇到数以百万计的问题。死锁、活锁、饥饿、同步问题等。请编辑此问题并发布你的代码,而不要看到你的代码。很难说这可能是由于什么原因造成的。你是否尝试将5s任务的优先级提高到高于其他任务的优先级,并查看是否存在任何问题效果?发送ping也是一个IO操作,因此该线程可能也会在等待IO时被卡住
nohup java -cp io-test-1.0-SNAPSHOT-jar-with-dependencies.jar dk.designware.io_test.ZKIOTest ./io-test-files 10 1024 5000000 IP-of-ZooKeeper-server:2181 > ./io-test-files/stdouterr.txt 2>&1 &