物理内存使用率太高

时间:2017-06-16 22:47:18

标签: java ubuntu-14.04 apache-storm

当我尝试使用

风暴在本地模式下运行拓扑时,出现此错误
mvn compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=my.Topology

错误是

ERROR backtype.storm.util - Async loop died!
java.lang.OutOfMemoryError: Physical memory usage is too high: physicalBytes = 3G > maxPhysicalBytes = 3G

我该如何解决?我不知道应该增加哪些物理内存!如果我在生产模式下运行拓扑,这个错误会消失吗?

  

更新

Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: None
Maximum Capacity: 32 GB
Error Information Handle: 0x0019
Number Of Devices: 4

5 个答案:

答案 0 :(得分:2)

我无法找到"物理内存使用率过高" OpenJDK 8或OpenJDK 9代码库中的消息,因此我 suspectt 它来自Apache Storm / Spark正在使用的本机代码库。

如果你能提供一个可以帮助追踪"罪魁祸首的堆栈跟踪"。

以下不是"基于证据的" ...

  

我不知道我应该增加哪些物理内存!

这取决于实际原因。可能性包括:

  1. 您的Java堆太小了。
  2. 出于架构原因,您的JVM无法将堆扩展到配置的max;例如你正在运行一个32位的JVM,并没有提供足够大的地址空间。
  3. 操作系统拒绝扩展您的进程内存,因为它没有足够的物理内存或交换空间。
  4. 由于" ulimit"操作系统拒绝扩展您的进程内存。或类似的资源限制。
  5. 我希望对上述所有内容进行不同的诊断...除了看起来诊断(即错误消息)显然不是来自JVM本身。

    上述问题可能由以下原因引起/触发:

    • 各种可配置的限制可能设置得太小
    • 使用32位JVM
    • 你的机器太小;即获得更多物理内存!
    • 你的问题太大了。
    • 您的应用程序存在错误或泄漏内存。
      

    如果我在生产模式下运行拓扑,这个错误会消失吗?

    无法预测。

    UPDATE - 基于堆栈跟踪,很明显错误消息来自org.bytedeco.javacpp库。特别是Pointer类。 (Sourcecode。)

    查看源代码,问题与名为" maxPhysicalMemory"的可配置参数有关。由" org.bytedeco.javacpp.maxphysicalbytes"配置。系统属性。

    尝试更改该属性。

    您可以通过Google搜索获得更多信息" org.bytedeco.javacpp.maxphysicalbytes"

答案 1 :(得分:2)

我也在使用Apache Storm和JavaCV(OpenCV)。我有两个拓扑,第二个拓扑结构有两个螺栓,一个用于将视频分成帧,另一个用于检测面孔。

我有同样的问题:

2017-08-02 11:19:18.578 o.a.s.util Thread-5-OpenCVBolt-executor[3 3] [ERROR] 
Async loop died!
java.lang.OutOfMemoryError: Physical memory usage is too high: physicalBytes = 1G > maxPhysicalBytes = 1G
at org.bytedeco.javacpp.Pointer.deallocator(Pointer.java:562) ~[stormjar.jar:?]
at org.bytedeco.javacpp.helper.opencv_core$AbstractCvMemStorage.create(opencv_core.java:1649) ~[stormjar.jar:?]
at org.bytedeco.javacpp.helper.opencv_core$AbstractCvMemStorage.create(opencv_core.java:1658) ~[stormjar.jar:?]
at OpenCVBolt.detect(OpenCVBolt.java:30) ~[stormjar.jar:?]
at OpenCVBolt.execute(OpenCVBolt.java:104) ~[stormjar.jar:?]
at org.apache.storm.daemon.executor$fn__4973$tuple_action_fn__4975.invoke(executor.clj:727) ~[storm-core-1.0.3.jar:1.0.3]
at org.apache.storm.daemon.executor$mk_task_receiver$fn__4894.invoke(executor.clj:459) ~[storm-core-1.0.3.jar:1.0.3]
at org.apache.storm.disruptor$clojure_handler$reify__4409.onEvent(disruptor.clj:40) ~[storm-core-1.0.3.jar:1.0.3]
at org.apache.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:453) ~[storm-core-1.0.3.jar:1.0.3]

我能够解决它。我不知道您是否使用JavaCV来处理视频和图像。如果是这样,并且您正在使用Maven,请确保您在pom.xml中使用JavaCV 1.3.2版:

<dependency>
  <groupId>org.bytedeco</groupId>
  <artifactId>javacv</artifactId>
  <version>1.3.2</version>
</dependency>

然后,您需要在Bolt中的prepare()方法中应用以下行来更改maxPhysicalBytes的属性。

System.setProperty("org.bytedeco.javacpp.maxphysicalbytes", "0"); 
System.setProperty("org.bytedeco.javacpp.maxbytes", "0");

这对我有用。错误消失了。我希望这会对你有所帮助。

<强>更新

@Override
public void prepare(Map conf, TopologyContext context, OutputCollector collector) {

    System.setProperty("org.bytedeco.javacpp.maxphysicalbytes", "0");
    System.setProperty("org.bytedeco.javacpp.maxbytes", "0");

    _collector = collector;
}

答案 2 :(得分:1)

我在研究DL4J sentimentRNN时遇到了同样的问题,经过大量研究后,我找到了一个资源,我发现我必须为VM参数添加一些选项

-Xms1024m
-Xmx10g
-XX:MaxPermSize=2g

我确信如果您将-Xms,-Xmx或XX的值调整到您的计算机规格,您将找到适用于您的计算机内存的内容。

我必须将此添加到我的vm选项中:

-Xms5024m -Xmx10g -XX:MaxPermSize=6g

我使用的是高规格的PC,上面的选项对我有用,让我的代码运行得更快。

我希望这会有所帮助

答案 3 :(得分:1)

我在尝试将 Java Tensorflow 从 1.X 升级到 2.X 并且同时使用 Java ZGC 时遇到了非常相似的错误。所以错误看起来像这样:

java.lang.OutOfMemoryError: Physical memory usage is too high: physicalBytes (12288M) > maxPhysicalBytes (12208M)
    at org.bytedeco.javacpp.Pointer.deallocator(Pointer.java:700)
    at org.tensorflow.internal.c_api.AbstractTF_Tensor.allocateTensor(AbstractTF_Tensor.java:91)
    at org.tensorflow.RawTensor.allocate(RawTensor.java:197)
    at org.tensorflow.RawTensor.allocate(RawTensor.java:131)
    at org.tensorflow.Tensor.of(Tensor.java:88)
    at org.tensorflow.Tensor.of(Tensor.java:154)
    at org.tensorflow.types.TString.tensorOfBytes(TString.java:170)

这是由于JavaCpp (v1.5.4)(在新的TF Java artifact v0.3.1中使用)在使用ZGC时无法正确计算物理内存使用量,并且它会更多地计算内存比真正使用的,然后抛出这个 OOM 错误 (see info here)。在其他情况下,它也可能无法正确计算内存(see some info here)

所以解决方案之一是设置JVM系统属性 -Dorg.bytedeco.javacpp.maxBytes=0 也如其他答案所述。基本上它“关闭了 JavaCPP 中的物理字节计数”。虽然这可能会或可能不会带来其他副作用,但我不确定。或者停止使用 ZGC 作为另一种解决方案,因为我们正在使用它。如果 ZGC 与您的情况无关,那么似乎唯一留给您的解决方案就是设置 maxBytes=0

其他一些相关信息可以在here中看到。

答案 4 :(得分:0)

这很可能意味着服务器中的空间不足。如果它是一个linux框,请执行此操作以检查可用内存: -
ps aux --sort -rss这将按RSS值

对进程RAM消耗进行排序
  RSS:驻留集大小,非交换物理内存即任务   使用(以千字节为单位)。

实施例: -

zhossain@zhossain-linux1:~$ ps aux --sort -rss
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
zhossain 31934 98.2  8.2 1941088 1328536 pts/4 Rl+  16:13   1:48 python /local/mnt/workspace/
root      2419  0.1  0.5 241156 88100 ?        Sl   Apr05 136:00 splunkd -h 127.0.0.1 -p 8089 restart
root      1544  0.1  0.3 740048 60820 ?        Ssl  Feb15 266:43 /usr/sbin/automount
root      2486  0.0  0.1 331680 28240 ?        S    11:19   0:11 smbd -F
root       867  0.0  0.1 257000 27472 ?        Ssl  Feb15   0:22 rsyslogd
colord    1973  0.0  0.0 304988 13900 ?        Sl   Feb15   1:37 /usr/lib/colord/colord