refactor: unwrap Heap namespace + self-reexport (#22931)
This commit is contained in:
@@ -8,52 +8,52 @@ const log = Log.create({ service: "heap" })
|
|||||||
const MINUTE = 60_000
|
const MINUTE = 60_000
|
||||||
const LIMIT = 2 * 1024 * 1024 * 1024
|
const LIMIT = 2 * 1024 * 1024 * 1024
|
||||||
|
|
||||||
export namespace Heap {
|
let timer: Timer | undefined
|
||||||
let timer: Timer | undefined
|
let lock = false
|
||||||
let lock = false
|
let armed = true
|
||||||
let armed = true
|
|
||||||
|
|
||||||
export function start() {
|
export function start() {
|
||||||
if (!Flag.OPENCODE_AUTO_HEAP_SNAPSHOT) return
|
if (!Flag.OPENCODE_AUTO_HEAP_SNAPSHOT) return
|
||||||
if (timer) return
|
if (timer) return
|
||||||
|
|
||||||
const run = async () => {
|
const run = async () => {
|
||||||
if (lock) return
|
if (lock) return
|
||||||
|
|
||||||
const stat = process.memoryUsage()
|
const stat = process.memoryUsage()
|
||||||
if (stat.rss <= LIMIT) {
|
if (stat.rss <= LIMIT) {
|
||||||
armed = true
|
armed = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (!armed) return
|
if (!armed) return
|
||||||
|
|
||||||
lock = true
|
lock = true
|
||||||
armed = false
|
armed = false
|
||||||
const file = path.join(
|
const file = path.join(
|
||||||
Global.Path.log,
|
Global.Path.log,
|
||||||
`heap-${process.pid}-${new Date().toISOString().replace(/[:.]/g, "")}.heapsnapshot`,
|
`heap-${process.pid}-${new Date().toISOString().replace(/[:.]/g, "")}.heapsnapshot`,
|
||||||
)
|
)
|
||||||
log.warn("heap usage exceeded limit", {
|
log.warn("heap usage exceeded limit", {
|
||||||
rss: stat.rss,
|
rss: stat.rss,
|
||||||
heap: stat.heapUsed,
|
heap: stat.heapUsed,
|
||||||
file,
|
file,
|
||||||
|
})
|
||||||
|
|
||||||
|
await Promise.resolve()
|
||||||
|
.then(() => writeHeapSnapshot(file))
|
||||||
|
.catch((err) => {
|
||||||
|
log.error("failed to write heap snapshot", {
|
||||||
|
error: err instanceof Error ? err.message : String(err),
|
||||||
|
file,
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
await Promise.resolve()
|
lock = false
|
||||||
.then(() => writeHeapSnapshot(file))
|
|
||||||
.catch((err) => {
|
|
||||||
log.error("failed to write heap snapshot", {
|
|
||||||
error: err instanceof Error ? err.message : String(err),
|
|
||||||
file,
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
lock = false
|
|
||||||
}
|
|
||||||
|
|
||||||
timer = setInterval(() => {
|
|
||||||
void run()
|
|
||||||
}, MINUTE)
|
|
||||||
timer.unref?.()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
timer = setInterval(() => {
|
||||||
|
void run()
|
||||||
|
}, MINUTE)
|
||||||
|
timer.unref?.()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export * as Heap from "./heap"
|
||||||
|
|||||||
Reference in New Issue
Block a user