container.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. const cgroup = require('./cgroup');
  2. const perfNow = require('./perfNow');
  3. const sleep = require('./sleep');
  4. const memoize = require('./memoize');
  5. const each = require('./each');
  6. const isEmpty = require('./isEmpty');
  7. const sum = require('./sum');
  8. const isNaN = require('./isNaN');
  9. const os = require('os');
  10. const cpuNum = memoize(function() {
  11. return cgroup.cpuset.cpus().effective.length;
  12. });
  13. const DEFAULT_PERIOD = 50;
  14. let lastUsage = 0;
  15. let lastNow = 0;
  16. function cpuUsage(period = 0) {
  17. if (!period && !lastNow) {
  18. period = DEFAULT_PERIOD;
  19. }
  20. let now = lastNow;
  21. let usage = lastUsage;
  22. if (period) {
  23. now = perfNow() * 1000;
  24. usage = cgroup.cpu.stat().usage;
  25. }
  26. return new Promise(resolve => {
  27. sleep(period).then(() => {
  28. lastUsage = cgroup.cpu.stat().usage;
  29. const delta = lastUsage - usage;
  30. lastNow = perfNow() * 1000;
  31. const totalTime = lastNow - now;
  32. resolve(delta / totalTime);
  33. });
  34. });
  35. }
  36. let lastCpuLoad = 0;
  37. function cpuLoad(period = 0) {
  38. const cpus = cgroup.cpuset.cpus().effective;
  39. return Promise.all([cpuUsage(period), realCpuLoads(cpus, period)]).then(
  40. res => {
  41. const realCpuLoads = res[1];
  42. let cpuLoad = sum.apply(null, realCpuLoads) / cpus.length;
  43. const max = cgroup.cpu.max();
  44. if (max !== Infinity) {
  45. const cpuUsage = res[0];
  46. const quotaLoad = cpuUsage / max;
  47. if (quotaLoad > cpuLoad) {
  48. cpuLoad = quotaLoad;
  49. }
  50. }
  51. if (isNaN(cpuLoad)) {
  52. return lastCpuLoad;
  53. }
  54. lastCpuLoad = cpuLoad;
  55. return cpuLoad;
  56. }
  57. );
  58. }
  59. let lastAllCpus = [];
  60. function realCpuLoads(cpus, period = 0) {
  61. const cpuLoads = [];
  62. if (!period && isEmpty(lastAllCpus)) {
  63. period = DEFAULT_PERIOD;
  64. }
  65. let allCpus = lastAllCpus;
  66. if (period) {
  67. allCpus = os.cpus();
  68. }
  69. return new Promise(function(resolve) {
  70. sleep(period).then(() => {
  71. lastAllCpus = os.cpus();
  72. each(cpus, (cpu, idx) => {
  73. cpuLoads[idx] = calculateCpuLoad(
  74. allCpus[cpu],
  75. lastAllCpus[cpu]
  76. );
  77. });
  78. resolve(cpuLoads);
  79. });
  80. });
  81. }
  82. function calculateCpuLoad(lastCpu, cpu) {
  83. const lastTimes = lastCpu.times;
  84. const times = cpu.times;
  85. const lastLoad =
  86. lastTimes.user + lastTimes.sys + lastTimes.nice + lastTimes.irq;
  87. const lastTick = lastLoad + lastTimes.idle;
  88. const load = times.user + times.sys + times.nice + times.irq;
  89. const tick = load + times.idle;
  90. return (load - lastLoad) / (tick - lastTick);
  91. }
  92. function memUsage() {
  93. return cgroup.memory.current();
  94. }
  95. function memLoad() {
  96. let max = os.totalmem();
  97. const cgroupMax = cgroup.memory.max();
  98. if (cgroupMax < max) {
  99. max = cgroupMax;
  100. }
  101. return memUsage() / max;
  102. }
  103. exports = {
  104. cpuNum,
  105. cpuUsage,
  106. cpuLoad,
  107. memUsage,
  108. memLoad
  109. };
  110. module.exports = exports;