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