febs-test
Version:
febs-test is a server stress test utility
147 lines (123 loc) • 4.08 kB
JavaScript
;
/**
* Copyright (c) 2017 Copyright brainpoint All Rights Reserved.
* Author: lipengxiang
* Date:
* Desc:
*/
const debug = require('debug')('febs-test');
var cluster = require('cluster');
var os = require('os');
var logger = require('./logger');
var exec = require('child_process').exec;
var ora = require('ora')
var spinner = ora('Testing... ');
var g_cur_process_num = 10;
const STEP_PROCESS = 10;
var is_win = os.platform().indexOf('win') == 0;
var g_workers = [];
//--------------------------------------------------------
// event:
// 'message' (data) workitem 发送来的消息.
// 'finish' () 完成了所有的任务.
//--------------------------------------------------------
module.exports = class {
constructor() {
}
/**
* @desc: 测试电脑的性能.
* @param opt:
* {
minMemory, // in byte, 保留的最小内存数.
logfile, // 日志文件位置. null则不会存储.
}
* @return:
*/
test(opt) {
logger.init(opt.logfile, opt.errfile);
// master.
if (cluster.isMaster) {
spinner.start();
//
// uncaughtException
process.on('uncaughtException', function (err) {
spinner.stop();
console.error(err);
logger.error(process.pid, err);
});
process.on('SIGINT', ()=>{
console.log('Finish max process number: ' + g_cur_process_num);
logger.info('Finish max process number: ' + g_cur_process_num);
spinner.stop();
this.finish();
});
opt.minMemory = opt.minMemory || 200*1024*1024;
opt.minMemory = Math.max(opt.minMemory, 200*1024*1024);
// welcome.
let welcomestr = `
************************************************************
* Memory test begin.
* ${os.hostname()} ${os.platform()}
* - cpu numbers: ${os.cpus().length}
* - cpu type: ${os.cpus()[0].model} ${os.cpus()[0].speed} MHz
* - total memory: ${Math.floor(os.totalmem() / 1024 / 1024)} MB
* - free memory: ${Math.floor(os.freemem() / 1024 / 1024)} MB
* ----------------------------------------------------------
* config of:
* - min memory: ${opt.minMemory / 1024 / 1024} MB
* - logfile: ${opt.logfile||''}
************************************************************
`
console.log(welcomestr);
logger.info(welcomestr);
debug('start fork');
setTimeout(()=>this.fork(opt), 1000);
}
// worker.
else {
setInterval(function(){}, 10000);
} // if..else.
}
//
// fork.
fork(opt) {
if (cluster.isMaster) {
for (; g_workers.length < g_cur_process_num;) {
g_workers.push( cluster.fork() );
}
console.log(` Current Process number: ${g_cur_process_num}, Free memory: ${Math.floor(os.freemem() / 1024 / 1024)} MB`);
logger.info(` Current Process number: ${g_cur_process_num}, Free memory: ${Math.floor(os.freemem() / 1024 / 1024)} MB`);
if (os.freemem() > opt.minMemory+50*1024*1024) {
g_cur_process_num += STEP_PROCESS;
setTimeout(()=>{
this.fork(opt);
}, 2000);
} else {
console.log('Finish max process number: ' + g_cur_process_num);
logger.info('Finish max process number: ' + g_cur_process_num);
spinner.stop();
this.finish();
}
}
}
/**
* @desc: all workitem finish.
* @return:
*/
finish() {
if (cluster.isMaster) {
debug('finish');
try {
for (let i = 0; i < g_workers.length; i++) {
if (!g_workers[i].isDead()) {
let cmd = is_win ? `taskkill /PID ${g_workers[i].process.pid} /F` : `kill ${g_workers[i].process.pid}`;
exec(cmd, function(err, stdout, stderr){
});
}
}
g_workers = [];
process.exit(0);
} catch(e) {}
}
}
};