From 6ded57fc0a969fafe96e9c2f4699ddb98e323373 Mon Sep 17 00:00:00 2001 From: Laurent Clouet Date: Fri, 10 Aug 2018 17:33:50 +0200 Subject: [PATCH] Use the actual available free memory instead of the max possible --- src/com/sheepit/client/Server.java | 10 ++++++++- src/com/sheepit/client/os/FreeBSD.java | 5 +++++ src/com/sheepit/client/os/Linux.java | 29 ++++++++++++++++++++++++++ src/com/sheepit/client/os/Mac.java | 5 +++++ src/com/sheepit/client/os/OS.java | 2 ++ src/com/sheepit/client/os/Windows.java | 15 +++++++++++++ 6 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/com/sheepit/client/Server.java b/src/com/sheepit/client/Server.java index c0d1217..0a99ba2 100644 --- a/src/com/sheepit/client/Server.java +++ b/src/com/sheepit/client/Server.java @@ -287,7 +287,15 @@ public class Server extends Thread implements HostnameVerifier, X509TrustManager HttpURLConnection connection = null; try { OS os = OS.getOS(); - String url = String.format("%s?computemethod=%s&cpu_cores=%s&ram_max=%s&rendertime_max=%s", this.getPage("request-job"), this.user_config.computeMethodToInt(), ((this.user_config.getNbCores() == -1) ? os.getCPU().cores() : this.user_config.getNbCores()), this.user_config.getMaxMemory(), this.user_config.getMaxRenderTime()); + int maxMemory = this.user_config.getMaxMemory(); + int freeMemory = os.getFreeMemory(); + if (maxMemory < 0) { + maxMemory = freeMemory; + } + else if (freeMemory > 0 && maxMemory > 0) { + maxMemory = Math.min(maxMemory, freeMemory); + } + String url = String.format("%s?computemethod=%s&cpu_cores=%s&ram_max=%s&rendertime_max=%s", this.getPage("request-job"), this.user_config.computeMethodToInt(), ((this.user_config.getNbCores() == -1) ? os.getCPU().cores() : this.user_config.getNbCores()), maxMemory, this.user_config.getMaxRenderTime()); if (this.user_config.getComputeMethod() != ComputeType.CPU && this.user_config.getGPUDevice() != null) { String gpu_model = ""; try { diff --git a/src/com/sheepit/client/os/FreeBSD.java b/src/com/sheepit/client/os/FreeBSD.java index 375d7c4..43f0f28 100644 --- a/src/com/sheepit/client/os/FreeBSD.java +++ b/src/com/sheepit/client/os/FreeBSD.java @@ -133,6 +133,11 @@ public class FreeBSD extends OS { return 0; } + @Override + public int getFreeMemory() { + return -1; + } + @Override public String getCUDALib() { return "cuda"; diff --git a/src/com/sheepit/client/os/Linux.java b/src/com/sheepit/client/os/Linux.java index e07baae..8f8e357 100644 --- a/src/com/sheepit/client/os/Linux.java +++ b/src/com/sheepit/client/os/Linux.java @@ -116,6 +116,35 @@ public class Linux extends OS { return 0; } + @Override + public int getFreeMemory() { + try { + String filePath = "/proc/meminfo"; + Scanner scanner = new Scanner(new File(filePath)); + + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + + if (line.startsWith("MemFree")) { + String buf[] = line.split(":"); + if (buf.length > 0) { + Integer buf2 = new Integer(buf[1].trim().split(" ")[0]); + return (((buf2 / 262144) + 1) * 262144); // 256*1024 = 262144 + } + } + } + scanner.close(); + } + catch (java.lang.NoClassDefFoundError e) { + System.err.println("OS::Linux::getFreeMemory error " + e + " mostly because Scanner class was introducted by Java 5 and you are running a lower version"); + } + catch (Exception e) { + e.printStackTrace(); + } + + return 0; + } + @Override public String getCUDALib() { return "cuda"; diff --git a/src/com/sheepit/client/os/Mac.java b/src/com/sheepit/client/os/Mac.java index 8d7f1ac..0d1bd34 100644 --- a/src/com/sheepit/client/os/Mac.java +++ b/src/com/sheepit/client/os/Mac.java @@ -140,6 +140,11 @@ public class Mac extends OS { return -1; } + @Override + public int getFreeMemory() { + return -1; + } + @Override public Process exec(List command, Map env) throws IOException { List actual_command = command; diff --git a/src/com/sheepit/client/os/OS.java b/src/com/sheepit/client/os/OS.java index 083ce65..5430398 100644 --- a/src/com/sheepit/client/os/OS.java +++ b/src/com/sheepit/client/os/OS.java @@ -33,6 +33,8 @@ public abstract class OS { public abstract int getMemory(); + public abstract int getFreeMemory(); + public abstract String getRenderBinaryPath(); public String getCUDALib() { diff --git a/src/com/sheepit/client/os/Windows.java b/src/com/sheepit/client/os/Windows.java index d5e5b56..905f038 100644 --- a/src/com/sheepit/client/os/Windows.java +++ b/src/com/sheepit/client/os/Windows.java @@ -102,6 +102,21 @@ public class Windows extends OS { return 0; } + @Override + public int getFreeMemory() { + try { + MEMORYSTATUSEX _memory = new MEMORYSTATUSEX(); + if (Kernel32.INSTANCE.GlobalMemoryStatusEx(_memory)) { + return (int) (_memory.ullAvailPhys.longValue() / 1024); // size in KB + } + } + catch (Exception e) { + e.printStackTrace(); + } + + return -1; + } + @Override public String getCUDALib() { return "nvcuda";