mirror of
https://github.com/evennia/evennia.git
synced 2026-03-18 05:46:31 +01:00
Made more work around memory profiling, added a small Script and display program for logging memory usage
This commit is contained in:
parent
58af67bdf2
commit
f49f33d40d
4 changed files with 95 additions and 28 deletions
76
src/utils/dummyrunner/memplot.py
Normal file
76
src/utils/dummyrunner/memplot.py
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
"""
|
||||
Script that saves memory and idmapper data over time.
|
||||
|
||||
Data will be saved to game/logs/memoryusage.log. Note that
|
||||
the script will append to this file if it already exists.
|
||||
|
||||
Call this module directly to plot the log (requires matplotlib and numpy).
|
||||
"""
|
||||
import os, sys
|
||||
import time
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
|
||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'game.settings'
|
||||
import ev
|
||||
from src.utils.idmapper import base as _idmapper
|
||||
|
||||
LOGFILE = "logs/memoryusage.log"
|
||||
INTERVAL = 30 # log every 30 seconds
|
||||
|
||||
class Memplot(ev.Script):
|
||||
def at_script_creation(self):
|
||||
self.key = "memplot"
|
||||
self.desc = "Save server memory stats to file"
|
||||
self.start_delay = False
|
||||
self.persistent = True
|
||||
self.interval = INTERVAL
|
||||
self.db.starttime = time.time()
|
||||
|
||||
def at_repeat(self):
|
||||
|
||||
pid = os.getpid()
|
||||
rmem = float(os.popen('ps -p %d -o %s | tail -1' % (pid, "rss")).read()) / 1000.0 # resident memory
|
||||
vmem = float(os.popen('ps -p %d -o %s | tail -1' % (pid, "vsz")).read()) / 1000.0 # virtual memory
|
||||
total_num, cachedict = _idmapper.cache_size()
|
||||
t0 = (time.time() - self.db.starttime) / 60.0 # save in minutes
|
||||
|
||||
with open(LOGFILE, "a") as f:
|
||||
f.write("%s, %s, %s, %s\n" % (t0, rmem, vmem, total_num))
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# plot output from the file
|
||||
|
||||
from matplotlib import pyplot as pp
|
||||
import numpy
|
||||
|
||||
data = numpy.genfromtxt(LOGFILE, delimiter=",")
|
||||
secs = data[:,0]
|
||||
rmem = data[:,1]
|
||||
vmem = data[:,2]
|
||||
nobj = data[:,3]
|
||||
|
||||
# correct for @reload
|
||||
#secs[359:] = secs[359:] + secs[358]
|
||||
|
||||
# count total amount of objects
|
||||
ntot = data[:,3].copy()
|
||||
#ntot[119:] = ntot[119:] + ntot[118] - ntot[119]
|
||||
#ntot[359:] = ntot[359:] + ntot[358] - ntot[359]
|
||||
|
||||
fig = pp.figure()
|
||||
ax1 = fig.add_subplot(111)
|
||||
ax1.set_title("Memory usage")
|
||||
ax1.set_xlabel("Time (mins)")
|
||||
ax1.set_ylabel("Memory usage (MB)")
|
||||
ax1.plot(secs, rmem, "r", label="RMEM", lw=2)
|
||||
ax1.plot(secs, vmem, "b", label="VMEM", lw=2)
|
||||
ax1.legend(loc="upper left")
|
||||
|
||||
ax2 = ax1.twinx()
|
||||
ax2.plot(secs, nobj, "g--", label="objs in cache", lw=2)
|
||||
ax2.plot(secs, ntot, "r--", label="objs total", lw=2)
|
||||
ax2.set_ylabel("Number of objects")
|
||||
ax2.legend(loc="lower right")
|
||||
ax2.annotate("idmapper\nflush", xy=(70,480))
|
||||
ax2.annotate("@reload", xy=(185,600))
|
||||
pp.show()
|
||||
Loading…
Add table
Add a link
Reference in a new issue