mirror of
https://github.com/HackPlan/RootPanel.git
synced 2026-01-12 22:27:09 +08:00
127 lines
4.1 KiB
CoffeeScript
127 lines
4.1 KiB
CoffeeScript
{child_process, os, fs, async, _} = app.libs
|
|
{config} = app
|
|
{Account} = app.models
|
|
|
|
linux = require './linux'
|
|
|
|
exports.last_plist = []
|
|
exports.resources_usage = {}
|
|
|
|
REDIS_LAST_PLIST = "#{config.redis.prefix}:linux.last_plist"
|
|
|
|
exports.run = ->
|
|
app.redis.get REDIS_LAST_PLIST, (err, last_plist) ->
|
|
exports.last_plist = JSON.parse(last_plist) ? []
|
|
|
|
exports.monitoring ->
|
|
setInterval ->
|
|
exports.monitoring ->
|
|
, config.plugins.linux.monitor_cycle
|
|
|
|
exports.monitoring = (callback) ->
|
|
REDIS_KEY = "#{config.redis.prefix}:linux.recent_resources_usage"
|
|
ITEM_IN_RESOURCES_LIST = 3600 * 1000 / config.plugins.linux.monitor_cycle
|
|
|
|
linux.getMemoryInfo (memory_info) ->
|
|
linux.getProcessList (plist) ->
|
|
plist = _.reject plist, (item) ->
|
|
return item.rss == 0
|
|
|
|
async.parallel
|
|
cpu: (callback) ->
|
|
exports.monitoringCpu plist, callback
|
|
|
|
memory: (callback) ->
|
|
exports.monitoringMemory plist, callback
|
|
|
|
, (err, result) ->
|
|
app.redis.get REDIS_KEY, (err, recent_resources_usage) ->
|
|
recent_resources_usage = JSON.parse(recent_resources_usage) ? []
|
|
recent_resources_usage.push result
|
|
recent_resources_usage = _.last recent_resources_usage, ITEM_IN_RESOURCES_LIST
|
|
|
|
resources_usage = {}
|
|
|
|
increaseAccountUsage = (username, type, value) ->
|
|
resources_usage[username] ?= {}
|
|
|
|
if resources_usage[username][type]
|
|
resources_usage[username][type] += value
|
|
else
|
|
resources_usage[username][type] = value
|
|
|
|
for item in recent_resources_usage
|
|
for account_name, cpu_usage of item.cpu
|
|
increaseAccountUsage account_name, 'cpu', cpu_usage
|
|
|
|
for account_name, memory_usage of item.memory
|
|
increaseAccountUsage account_name, 'memory', memory_usage
|
|
|
|
for username, usage of resources_usage
|
|
base = config.plugins.linux.monitor_cycle / 1000
|
|
usage.memory = parseFloat (usage.memory / recent_resources_usage.length / base).toFixed(1)
|
|
|
|
async.each _.keys(resources_usage), (username, callback) ->
|
|
Account.search username, (account) ->
|
|
unless account
|
|
return callback()
|
|
|
|
if os.loadavg()[0] > 1
|
|
if resources_usage[username].cpu > account.resources_limit.cpu
|
|
child_process.exec "sudo pkill -SIGKILL -u #{username}", ->
|
|
|
|
if memory_info.used_per > 75
|
|
if resources_usage[username].memory > account.resources_limit.memory
|
|
child_process.exec "sudo pkill -SIGKILL -u #{username}", ->
|
|
|
|
callback()
|
|
, ->
|
|
app.redis.set REDIS_KEY, JSON.stringify(recent_resources_usage), ->
|
|
exports.resources_usage = resources_usage
|
|
|
|
app.redis.setex REDIS_LAST_PLIST, 60, JSON.stringify(plist), ->
|
|
exports.last_plist = plist
|
|
callback()
|
|
|
|
exports.monitoringCpu = (plist, callback) ->
|
|
total_time = {}
|
|
|
|
findLastProcess = (process) ->
|
|
return _.find exports.last_plist, (i) ->
|
|
return i.pid == process.pid and i.user == process.user and i.command == process.command
|
|
|
|
addTime = (account_name, time) ->
|
|
if total_time[account_name]
|
|
total_time[account_name] += time
|
|
else
|
|
total_time[account_name] = time
|
|
|
|
exist_process = _.filter plist, (item) ->
|
|
return findLastProcess item
|
|
|
|
new_process = _.filter plist, (item) ->
|
|
return not findLastProcess item
|
|
|
|
for item in exist_process
|
|
last_process = findLastProcess item
|
|
addTime item.user, item.time - last_process.time
|
|
|
|
for item in new_process
|
|
addTime item.user, item.time
|
|
|
|
callback null, total_time
|
|
|
|
exports.monitoringMemory = (plist, callback) ->
|
|
total_memory = {}
|
|
|
|
addMemory = (account_name, menory) ->
|
|
if total_memory[account_name]
|
|
total_memory[account_name] += menory
|
|
else
|
|
total_memory[account_name] = menory
|
|
|
|
for item in plist
|
|
addMemory item.user, parseInt ((item.rss / 1024) * config.plugins.linux.monitor_cycle / 1000).toFixed()
|
|
|
|
callback null, total_memory
|