os: информация о системе

Встроенный модуль os предоставляет API для получения информации об операционной системе: количество CPU, объём памяти, домашняя директория, тип платформы, hostname — без сторонних зависимостей.

Зачем нужно

Информация об ОС необходима для адаптивной конфигурации приложения: количество Worker Threads или cluster-воркеров зависит от числа CPU, временные файлы пишутся в os.tmpdir, кроссплатформенный код использует os.platform и os.EOL. PM2 и cluster используют os.cpus.length для автомасштабирования.

Где используется

  • Cluster/Worker Threads — os.cpus.length для числа воркеров
  • Логирование — os.hostname для идентификации сервера
  • Временные файлы — os.tmpdir для безопасного пути
  • Health-check эндпоинты — свободная память, uptime
  • Кроссплатформенный код — os.platform, os.EOL

Основной контент

Основные методы

const os = require('os');

// Платформа
console.log(os.platform);    // 'linux', 'win32', 'darwin'
console.log(os.arch);        // 'x64', 'arm64', 'ia32'
console.log(os.release());     // '5.15.0-91-generic'
console.log(os.type);        // 'Linux', 'Windows_NT', 'Darwin'

// Хост
console.log(os.hostname);    // 'prod-server-1'

// Память
console.log(os.totalmem);    // 8589934592 (8 GB в байтах)
console.log(os.freemem);     // 2147483648 (2 GB свободно)

const memUsage = (1 - os.freemem / os.totalmem) * 100;
console.log(`Memory: ${memUsage.toFixed(1)}%`);

// Uptime сервера
console.log(os.uptime); // секунды с момента запуска ОС
const uptimeHours = (os.uptime / 3600).toFixed(1);
console.log(`Server uptime: ${uptimeHours}h`);

// Пути
console.log(os.homedir);  // '/home/user' или 'C:\\Users\\User'
console.log(os.tmpdir);   // '/tmp' или 'C:\\Temp'

// Разделитель строк
console.log(os.EOL);        // '\n' (Unix) или '\r\n' (Windows)

CPU — ядра процессора

const cpus = os.cpus;
console.log(`CPU: ${cpus[0].model}`);      // 'Intel Core i7-12700K'
console.log(`Cores: ${cpus.length}`);      // 12

// Детальная информация о каждом ядре
cpus.forEach((cpu, i) => {
  console.log(`Core ${i}: ${cpu.speed} MHz`);
  console.log('  user:', cpu.times.user);
  console.log('  sys:', cpu.times.sys);
  console.log('  idle:', cpu.times.idle);
});

Практические применения

const os = require('os');
const cluster = require('cluster');

// Cluster с числом воркеров по числу CPU
if (cluster.isPrimary) {
  const numWorkers = os.cpus.length;
  console.log(`Starting ${numWorkers} workers on ${os.hostname}`);
  for (let i = 0; i < numWorkers; i++) cluster.fork;
}

// Worker Threads
const { Worker } = require('worker_threads');
const pool = ;
for (let i = 0; i < os.cpus.length; i++) {
  pool.push(new Worker('./worker.js'));
}

// Временный файл
const path = require('path');
const tempFile = path.join(os.tmpdir, `upload-${Date.now()}.tmp`);

Health-check эндпоинт

app.get('/api/health', (req, res) => {
  const totalMem = os.totalmem;
  const freeMem = os.freemem;
  const usedMem = totalMem - freeMem;

  res.json({
    status: 'healthy',
    hostname: os.hostname,
    platform: os.platform,
    arch: os.arch,
    nodeVersion: process.version,
    uptime: {
      process: Math.floor(process.uptime),  // секунд работы Node
      system: Math.floor(os.uptime)         // секунд работы ОС
    },
    memory: {
      total: (totalMem / 1024 ** 3).toFixed(2) + ' GB',
      free: (freeMem / 1024 ** 3).toFixed(2) + ' GB',
      used: (usedMem / 1024 ** 3).toFixed(2) + ' GB',
      percent: ((usedMem / totalMem) * 100).toFixed(1) + '%'
    },
    cpu: {
      cores: os.cpus.length,
      model: os.cpus[0]?.model
    }
  });
});

Сетевые интерфейсы

const interfaces = os.networkInterfaces;

// Получить все IP-адреса
Object.entries(interfaces).forEach(([name, addrs]) => {
  addrs.forEach(({ family, address, internal }) => {
    if (!internal && family === 'IPv4') {
      console.log(`${name}: ${address}`);
    }
  });
});
// eth0: 192.168.1.100
// lo: (пропускаем internal)

Частые ошибки

  • Хардкодить число потоковnew Array(4).fill(null).map( => cluster.fork) — лучше os.cpus.length
  • Использовать os.freemem как индикатор проблем — ОС агрессивно использует память под кеш файловой системы; значение может быть маленьким даже при нормальной работе
  • os.tmpdir без уникального имени — одновременные запросы перезапишут одинаковые временные файлы; добавлять Date.now() или crypto.randomBytes

Связанные темы

Ресурсы