From 9f9f5af964d6661bb1d6bd1f2ea91098bcad62b0 Mon Sep 17 00:00:00 2001 From: Chip Morningstar Date: Wed, 18 Mar 2020 16:08:30 -0700 Subject: [PATCH] feat: Log (and graph) database disk usage --- packages/swing-store-lmdb/lmdbSwingStore.js | 8 ++++- packages/swingset-runner/bin/graphDisk | 1 + packages/swingset-runner/src/graphDisk.js | 16 +++++++++ packages/swingset-runner/src/main.js | 39 ++++++++++++++------- 4 files changed, 50 insertions(+), 14 deletions(-) create mode 120000 packages/swingset-runner/bin/graphDisk create mode 100755 packages/swingset-runner/src/graphDisk.js diff --git a/packages/swing-store-lmdb/lmdbSwingStore.js b/packages/swing-store-lmdb/lmdbSwingStore.js index 90123198a0f..70b158661f7 100644 --- a/packages/swing-store-lmdb/lmdbSwingStore.js +++ b/packages/swing-store-lmdb/lmdbSwingStore.js @@ -39,6 +39,12 @@ function makeSwingStore(dirPath, forceReset = false) { } } + function diskUsage() { + const dataFilePath = `${dirPath}/data.mdb`; + const stat = fs.statSync(dataFilePath); + return stat.size; + } + /** * Obtain the value stored for a given key. * @@ -180,7 +186,7 @@ function makeSwingStore(dirPath, forceReset = false) { lmdbEnv = null; } - return { storage, commit, close }; + return { storage, commit, close, diskUsage }; } /** diff --git a/packages/swingset-runner/bin/graphDisk b/packages/swingset-runner/bin/graphDisk new file mode 120000 index 00000000000..b3a10edaada --- /dev/null +++ b/packages/swingset-runner/bin/graphDisk @@ -0,0 +1 @@ +../src/graphDisk.js \ No newline at end of file diff --git a/packages/swingset-runner/src/graphDisk.js b/packages/swingset-runner/src/graphDisk.js new file mode 100755 index 00000000000..be2dff89a4d --- /dev/null +++ b/packages/swingset-runner/src/graphDisk.js @@ -0,0 +1,16 @@ +#!/usr/bin/env -S node -r esm + +import { dataGraphApp } from './dataGraphApp'; + +export async function main() { + // prettier-ignore + await dataGraphApp( + 'block', + 'Block #', + 'disk', + 'Database size (bytes)', + ['disk'], + ); +} + +main(); diff --git a/packages/swingset-runner/src/main.js b/packages/swingset-runner/src/main.js index d95315f9d49..b879323727f 100644 --- a/packages/swingset-runner/src/main.js +++ b/packages/swingset-runner/src/main.js @@ -30,15 +30,16 @@ Command line: runner [FLAGS...] CMD [{BASEDIR|--} [ARGS...]] FLAGS may be: - --no-ses - directs vats not to be run in SES. --init - discard any existing saved state at startup. - --lmdb - runs using LMDB as the data store - --filedb - runs using the simple file-based data store (default) + --lmdb - runs using LMDB as the data store (default) + --filedb - runs using the simple file-based data store --memdb - runs using the non-persistent in-memory data store --blockmode - run in block mode (checkpoint every BLOCKSIZE blocks) --blocksize N - set BLOCKSIZE to N (default 200) --logtimes - log block execution time stats while running --logmem - log memory usage stats after each block + --logdisk - log disk space usage stats after each block + --logall - log block times, memory use, and disk space --forcegc - run garbage collector after each block --batchsize N - set BATCHSIZE to N (default 200) @@ -73,21 +74,18 @@ function fail(message, printUsage) { export async function main() { const argv = process.argv.splice(2); - let withSES = true; let forceReset = false; - let dbMode = '--filedb'; + let dbMode = '--lmdb'; let blockSize = 200; let batchSize = 200; let blockMode = false; let logTimes = false; let logMem = false; + let logDisk = false; let forceGC = false; - while (argv[0] && argv[0].startsWith('--')) { + while (argv[0] && argv[0].startsWith('-')) { const flag = argv.shift(); switch (flag) { - case '--no-ses': - withSES = false; - break; case '--init': forceReset = true; break; @@ -97,6 +95,14 @@ export async function main() { case '--logmem': logMem = true; break; + case '--logdisk': + logDisk = true; + break; + case '--logall': + logTimes = true; + logMem = true; + logDisk = true; + break; case '--forcegc': forceGC = true; break; @@ -178,18 +184,21 @@ export async function main() { let blockNumber = 0; let statLogger = null; - if (logTimes || logMem) { + if (logTimes || logMem || logDisk) { let headers = ['block', 'steps']; if (logTimes) { - headers = headers.concat(['btime']); + headers.push('btime'); } if (logMem) { headers = headers.concat(['rss', 'heapTotal', 'heapUsed', 'external']); } + if (logDisk) { + headers.push('disk'); + } statLogger = makeStatLogger('runner', headers); } - const controller = await buildVatController(config, withSES, bootstrapArgv); + const controller = await buildVatController(config, true, bootstrapArgv); switch (command) { case 'run': { await commandRun(0, blockMode); @@ -292,7 +301,7 @@ export async function main() { blockNumber += 1; let data = [blockNumber, actualSteps]; if (logTimes) { - data = data.concat([blockEndTime - blockStartTime]); + data.push(blockEndTime - blockStartTime); } if (logMem) { const mem = process.memoryUsage(); @@ -303,6 +312,10 @@ export async function main() { mem.external, ]); } + if (logDisk) { + const diskUsage = dbMode === '--lmdb' ? store.diskUsage() : 0; + data.push(diskUsage); + } statLogger.log(data); } return actualSteps;