示例#1
0
const checkMemoryUsage = promises.serializeAsyncCall(async () => {
  const usage = new Map();
  await Promise.all(clangServers.values().map(async server => {
    const mem = await server.getMemoryUsage();
    usage.set(server, mem);
  }));

  // Servers may have been deleted in the meantime, so calculate the total now.
  let total = 0;
  let count = 0;
  clangServers.forEach(server => {
    const mem = usage.get(server);
    if (mem) {
      total += mem;
      count++;
    }
  });

  // Remove servers until we're under the memory limit.
  // Make sure we allow at least one server to stay alive.
  if (count > 1 && total > MEMORY_LIMIT) {
    const toDispose = [];
    clangServers.rforEach((server, key) => {
      const mem = usage.get(server);
      if (mem && count > 1 && total > MEMORY_LIMIT) {
        total -= mem;
        count--;
        toDispose.push(key);
      }
    });
    toDispose.forEach(key => clangServers.del(key));
  }
});
示例#2
0
  async _checkMemoryUsageImpl(): Promise<number> {
    const serverPids = this._servers
      .values()
      .map(server => server.getPID())
      .filter(Boolean);
    if (serverPids.length === 0) {
      return 0;
    }

    const usage = await memoryUsagePerPid(serverPids);
    let total = Array.from(usage.values()).reduce((a, b) => a + b, 0);

    // Remove servers until we're under the memory limit.
    // Make sure we allow at least one server to stay alive.
    let count = usage.size;
    if (count > 1 && total > this._memoryLimit) {
      const toDispose = [];
      this._servers.rforEach((server, key) => {
        const mem = usage.get(server.getPID());
        if (mem != null && count > 1 && total > this._memoryLimit) {
          total -= mem;
          count--;
          toDispose.push(key);
        }
      });
      toDispose.forEach(key => this._servers.del(key));
    }

    return total;
  }