Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8242480

Negative value may be returned by getFreeSwapSpaceSize() in the docker

XMLWordPrintable

        Negative values were returned by getFreeSwapSpaceSize() in our docker testing.
        The reason is that current implementation doesn't consider the situation when memory.limit_in_bytes == memory.memsw.limit_in_bytes, which means do not use the swap space at all.

        In src/jdk.management/unix/classes/com/sun/management/internal/OperatingSystemImpl.java, let's see
        ------------------------------------------------
         71 public long getFreeSwapSpaceSize() {
         72 if (containerMetrics != null) {
         73 long memSwapLimit = containerMetrics.getMemoryAndSwapLimit();
         74 long memLimit = containerMetrics.getMemoryLimit();
         75 if (memSwapLimit >= 0 && memLimit >= 0) {
         76 for (int attempt = 0; attempt < MAX_ATTEMPTS_NUMBER; attempt++) {
         77 long memSwapUsage = containerMetrics.getMemoryAndSwapUsage();
         78 long memUsage = containerMetrics.getMemoryUsage();
         79 if (memSwapUsage > 0 && memUsage > 0) {
         80 // We read "memory usage" and "memory and swap usage" not atomically,
         81 // and it's possible to get the negative value when subtracting these two.
         82 // If this happens just retry the loop for a few iterations.
         83 if ((memSwapUsage - memUsage) >= 0) {
         84 return memSwapLimit - memLimit - (memSwapUsage - memUsage);
         85 }
         86 }
         87 }
         88 }
         89 }
         90 return getFreeSwapSpaceSize0();
         91 }
        ------------------------------------------------
        If memSwapLimit (@line 73) equals memLimit (@line 74), then getFreeSwapSpaceSize() may return a negative value @line 84.

              jiefu Jie Fu
              jiefu Jie Fu
              Votes:
              0 Vote for this issue
              Watchers:
              7 Start watching this issue

                Created:
                Updated:
                Resolved: