@mark1russell7/rigor-chaos 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/build/index.d.ts +2 -2
- package/build/measure.d.ts +20 -1
- package/build/measure.d.ts.map +1 -1
- package/build/measure.js +21 -2
- package/build/measure.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -27,7 +27,8 @@ A schedule is data. A driver reads `times`, and it sends each arrival at its tim
|
|
|
27
27
|
- `service` is the reply less the send. This is what a closed-loop driver measures.
|
|
28
28
|
- `lag` is the send less the planned time.
|
|
29
29
|
- `censored` holds the age at the end of each arrival with no reply. Each value is a lower bound of a latency.
|
|
30
|
+
- `seconds` is optional. It holds the samples that the driver read of itself: the processor share, and the p99 and the largest delay of its event loop.
|
|
30
31
|
|
|
31
32
|
`latencyQuantile` reads the latency and the censored values together, by the nearest rank. Thus an arrival with no reply does not leave the measure.
|
|
32
33
|
|
|
33
|
-
`scheduleHeld` tells if the driver kept the schedule. A run that fails this check measures its driver, not its target. An A/A run with no fault examines this first.
|
|
34
|
+
`scheduleHeld` tells if the driver kept the schedule. A run that fails this check measures its driver, not its target. An A/A run with no fault examines this first. When a run fails this check, `seconds` tells if a full processor or a held event loop made the sends late.
|
package/build/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { Arrivals, Phase, Profile, SCHEDULE_FORMAT, Schedule, ScheduleOptions, checkProfile, constant, expectedArrivals, ramp, schedule, spike, steps } from "./schedule.js";
|
|
2
|
-
import { Completion, LoadMeasure, ScheduleCheck, latencyQuantile, measureLoad, scheduleHeld } from "./measure.js";
|
|
3
|
-
export { type Arrivals, type Completion, type LoadMeasure, type Phase, type Profile, SCHEDULE_FORMAT, type Schedule, type ScheduleCheck, type ScheduleOptions, checkProfile, constant, expectedArrivals, latencyQuantile, measureLoad, ramp, schedule, scheduleHeld, spike, steps };
|
|
2
|
+
import { Completion, LoadMeasure, ScheduleCheck, SecondSample, latencyQuantile, measureLoad, scheduleHeld } from "./measure.js";
|
|
3
|
+
export { type Arrivals, type Completion, type LoadMeasure, type Phase, type Profile, SCHEDULE_FORMAT, type Schedule, type ScheduleCheck, type ScheduleOptions, type SecondSample, checkProfile, constant, expectedArrivals, latencyQuantile, measureLoad, ramp, schedule, scheduleHeld, spike, steps };
|
package/build/measure.d.ts
CHANGED
|
@@ -15,6 +15,20 @@ export interface Completion {
|
|
|
15
15
|
/** This time is null for an arrival with no reply. */
|
|
16
16
|
readonly done: number | null;
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* A second sample is what a driver process read of itself over one second of a run. It tells if a late
|
|
20
|
+
* send came from a full processor or from a held event loop. Each reading is optional.
|
|
21
|
+
*/
|
|
22
|
+
export interface SecondSample {
|
|
23
|
+
/** This time is the start of the second, in ms from the start of the schedule. */
|
|
24
|
+
readonly at: number;
|
|
25
|
+
/** This share is the processor time of the process over the time of the sample. One full core reads 1. */
|
|
26
|
+
readonly cpu?: number;
|
|
27
|
+
/** This time is the p99 of the delay of the event loop in this second, in ms. */
|
|
28
|
+
readonly loopP99?: number;
|
|
29
|
+
/** This time is the largest delay of the event loop in this second, in ms. */
|
|
30
|
+
readonly loopMax?: number;
|
|
31
|
+
}
|
|
18
32
|
/** This is the measure of one run of a schedule. Each list is in the order of the schedule. */
|
|
19
33
|
export interface LoadMeasure {
|
|
20
34
|
readonly planned: number;
|
|
@@ -30,13 +44,18 @@ export interface LoadMeasure {
|
|
|
30
44
|
readonly lag: readonly number[];
|
|
31
45
|
/** These times are the age at the end of each arrival with no reply. Each one is a lower bound of a latency. */
|
|
32
46
|
readonly censored: readonly number[];
|
|
47
|
+
/** These samples are the seconds that the driver read, in order of time. A run with no list of samples has no such field. */
|
|
48
|
+
readonly seconds?: readonly SecondSample[];
|
|
33
49
|
}
|
|
34
50
|
/**
|
|
35
51
|
* This function gives the measure of a run. `end` is the end of the run, in ms from the start of the
|
|
36
52
|
* schedule. It throws a `RangeError` for an index outside the schedule and for two completions of
|
|
37
53
|
* one index. It throws the same error for a reply before its send and for a time past `end`.
|
|
54
|
+
*
|
|
55
|
+
* `seconds` is optional, and the measure holds it as given. A sample must be in order and inside the
|
|
56
|
+
* run, and each reading must be finite and not negative. Otherwise the function throws the same error.
|
|
38
57
|
*/
|
|
39
|
-
export declare function measureLoad(plan: Schedule, completions: readonly Completion[], end: number): LoadMeasure;
|
|
58
|
+
export declare function measureLoad(plan: Schedule, completions: readonly Completion[], end: number, seconds?: readonly SecondSample[]): LoadMeasure;
|
|
40
59
|
/**
|
|
41
60
|
* This function gives a quantile of the latency, with each arrival with no reply at its lower bound.
|
|
42
61
|
* With a censored value, the result is a lower bound of the true quantile. It uses the nearest rank,
|
package/build/measure.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"measure.d.ts","names":[],"sources":["../src/measure.ts"],"mappings":";;;;;;;;;;iBAaiB;;WAEN;WACA;;WAEA;;;iBAIM;WACN;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA
|
|
1
|
+
{"version":3,"file":"measure.d.ts","names":[],"sources":["../src/measure.ts"],"mappings":";;;;;;;;;;iBAaiB;;WAEN;WACA;;WAEA;;;;;;iBAOM;;WAEN;;WAEA;;WAEA;;WAEA;;;iBAIM;WACN;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA,mBAAmB;;;;;;;;;;wBAwBd,YAAY,MAAM,UAAU,sBAAsB,cAAc,aAAa,mBAAmB,iBAAiB;;;;;;wBAoCjH,gBAAgB,SAAS,aAAa;;iBAKrC;WACN;;WAEA;;WAEA;WACA;;;;;;;wBAQK,aAAa,SAAS,aAAa,gBAAgB"}
|
package/build/measure.js
CHANGED
|
@@ -1,11 +1,29 @@
|
|
|
1
1
|
import { quantile } from "@mark1russell7/rigor-statistics";
|
|
2
2
|
// src/measure.ts
|
|
3
|
+
/** This function throws a `RangeError` for a sample that a measure of this run cannot hold. */
|
|
4
|
+
function checkSeconds(seconds, end) {
|
|
5
|
+
let last = Number.NEGATIVE_INFINITY;
|
|
6
|
+
for (const { at, cpu, loopP99, loopMax } of seconds) {
|
|
7
|
+
if (!(at >= 0 && at <= end && at > last)) throw new RangeError(`measureLoad: the sample at ${at} is not in order, in a run that stops at ${end}.`);
|
|
8
|
+
last = at;
|
|
9
|
+
for (const value of [
|
|
10
|
+
cpu,
|
|
11
|
+
loopP99,
|
|
12
|
+
loopMax
|
|
13
|
+
]) if (value !== void 0 && !(value >= 0 && Number.isFinite(value))) throw new RangeError(`measureLoad: the sample at ${at} has the reading ${value}.`);
|
|
14
|
+
if (loopP99 !== void 0 && loopMax !== void 0 && loopMax < loopP99) throw new RangeError(`measureLoad: the sample at ${at} has a largest delay of ${loopMax} under its p99 of ${loopP99}.`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
3
17
|
/**
|
|
4
18
|
* This function gives the measure of a run. `end` is the end of the run, in ms from the start of the
|
|
5
19
|
* schedule. It throws a `RangeError` for an index outside the schedule and for two completions of
|
|
6
20
|
* one index. It throws the same error for a reply before its send and for a time past `end`.
|
|
21
|
+
*
|
|
22
|
+
* `seconds` is optional, and the measure holds it as given. A sample must be in order and inside the
|
|
23
|
+
* run, and each reading must be finite and not negative. Otherwise the function throws the same error.
|
|
7
24
|
*/
|
|
8
|
-
function measureLoad(plan, completions, end) {
|
|
25
|
+
function measureLoad(plan, completions, end, seconds) {
|
|
26
|
+
if (seconds !== void 0) checkSeconds(seconds, end);
|
|
9
27
|
const byIndex = /* @__PURE__ */ new Map();
|
|
10
28
|
for (const completion of completions) {
|
|
11
29
|
if (!Number.isInteger(completion.index) || completion.index < 0 || completion.index >= plan.times.length) throw new RangeError(`measureLoad: the index ${completion.index} is not in the schedule of ${plan.times.length} arrivals.`);
|
|
@@ -37,7 +55,8 @@ function measureLoad(plan, completions, end) {
|
|
|
37
55
|
latency,
|
|
38
56
|
service,
|
|
39
57
|
lag,
|
|
40
|
-
censored
|
|
58
|
+
censored,
|
|
59
|
+
...seconds === void 0 ? {} : { seconds }
|
|
41
60
|
};
|
|
42
61
|
}
|
|
43
62
|
/**
|
package/build/measure.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"measure.js","names":[],"sources":["../src/measure.ts"],"sourcesContent":["import { quantile } from \"@mark1russell7/rigor-statistics\";\nimport type { Schedule } from \"./schedule.ts\";\n\n/**\n * A closed-loop driver waits for a reply before its next request, thus a stall hides the requests\n * of its interval. This is coordinated omission. This module counts each latency from\n * the planned time, thus a stall counts in each arrival that it delayed.\n *\n * An arrival with no reply at the end of a run does not leave the measure. Its age at the end is a\n * lower bound of its latency, and a quantile reads it.\n */\n\n/** A completion is what a driver saw of one arrival. Its times are in ms from the start of the schedule. */\nexport interface Completion {\n /** This number is the position of the arrival in the schedule. */\n readonly index: number;\n readonly sent: number;\n /** This time is null for an arrival with no reply. */\n readonly done: number | null;\n}\n\n/** This is the measure of one run of a schedule. Each list is in the order of the schedule. */\nexport interface LoadMeasure {\n readonly planned: number;\n /** This count is the number of arrivals that the driver did not send. */\n readonly unsent: number;\n /** This count is the number of arrivals that had no reply at the end of the run. */\n readonly unfinished: number;\n /** These times are the reply less the planned time: what a user waited. */\n readonly latency: readonly number[];\n /** These times are the reply less the send: the measure of a closed-loop driver. */\n readonly service: readonly number[];\n /** These times are the send less the planned time, for each arrival that the driver sent. */\n readonly lag: readonly number[];\n /** These times are the age at the end of each arrival with no reply. Each one is a lower bound of a latency. */\n readonly censored: readonly number[];\n}\n\n/**\n * This function gives the measure of a run. `end` is the end of the run, in ms from the start of the\n * schedule. It throws a `RangeError` for an index outside the schedule and for two completions of\n * one index. It throws the same error for a reply before its send and for a time past `end`.\n */\nexport function measureLoad(plan: Schedule, completions: readonly Completion[], end: number): LoadMeasure {\n const byIndex = new Map<number, Completion>();\n for (const completion of completions) {\n if (!Number.isInteger(completion.index) || completion.index < 0 || completion.index >= plan.times.length)\n throw new RangeError(`measureLoad: the index ${completion.index} is not in the schedule of ${plan.times.length} arrivals.`);\n if (byIndex.has(completion.index)) throw new RangeError(`measureLoad: the index ${completion.index} has two completions.`);\n const last = completion.done ?? completion.sent;\n if (!(completion.sent <= last && last <= end))\n throw new RangeError(`measureLoad: the index ${completion.index} has a send at ${completion.sent} and a reply at ${completion.done}, in a run that stops at ${end}.`);\n byIndex.set(completion.index, completion);\n }\n const latency: number[] = [];\n const service: number[] = [];\n const lag: number[] = [];\n const censored: number[] = [];\n let unfinished = 0;\n plan.times.forEach((planned, index) => {\n const completion = byIndex.get(index);\n if (completion !== undefined) lag.push(completion.sent - planned);\n if (completion === undefined || completion.done === null) {\n if (completion !== undefined) unfinished += 1;\n censored.push(Math.max(0, end - planned));\n return;\n }\n latency.push(completion.done - planned);\n service.push(completion.done - completion.sent);\n });\n return { planned: plan.times.length, unsent: plan.times.length - byIndex.size, unfinished, latency, service, lag, censored };\n}\n\n/**\n * This function gives a quantile of the latency, with each arrival with no reply at its lower bound.\n * With a censored value, the result is a lower bound of the true quantile. It uses the nearest rank,\n * thus the result is a measured value. It throws a `RangeError` for a run with no arrivals.\n */\nexport function latencyQuantile(measure: LoadMeasure, p: number): number {\n return quantile([...measure.latency, ...measure.censored], p, \"nearest-rank\");\n}\n\n/** This is the check of a driver: the schedule held, or the reason that it did not. */\nexport interface ScheduleCheck {\n readonly held: boolean;\n /** This time is the largest size of a lag, or null with no send. */\n readonly worst: number | null;\n /** This count is the number of sends past the limit. */\n readonly late: number;\n readonly reason: string;\n}\n\n/**\n * This function tells if a driver kept the schedule: it sent each arrival, each within `limit` ms of\n * its planned time. A run that fails this check measures its driver, not the target, thus an A/A run\n * with no fault reads it first.\n */\nexport function scheduleHeld(measure: LoadMeasure, limit: number): ScheduleCheck {\n const worst = measure.lag.reduce<number | null>((most, lag) => Math.max(most ?? 0, Math.abs(lag)), null);\n const late = measure.lag.filter((lag) => Math.abs(lag) > limit).length;\n const held = measure.unsent === 0 && late === 0;\n const facts = `${measure.planned} planned, ${measure.unsent} not sent, ${late} past ${limit} ms, the worst ${worst ?? \"none\"} ms`;\n return { held, worst, late, reason: `The driver ${held ? \"kept\" : \"did not keep\"} the schedule (${facts}).` };\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"measure.js","names":[],"sources":["../src/measure.ts"],"sourcesContent":["import { quantile } from \"@mark1russell7/rigor-statistics\";\nimport type { Schedule } from \"./schedule.ts\";\n\n/**\n * A closed-loop driver waits for a reply before its next request, thus a stall hides the requests\n * of its interval. This is coordinated omission. This module counts each latency from\n * the planned time, thus a stall counts in each arrival that it delayed.\n *\n * An arrival with no reply at the end of a run does not leave the measure. Its age at the end is a\n * lower bound of its latency, and a quantile reads it.\n */\n\n/** A completion is what a driver saw of one arrival. Its times are in ms from the start of the schedule. */\nexport interface Completion {\n /** This number is the position of the arrival in the schedule. */\n readonly index: number;\n readonly sent: number;\n /** This time is null for an arrival with no reply. */\n readonly done: number | null;\n}\n\n/**\n * A second sample is what a driver process read of itself over one second of a run. It tells if a late\n * send came from a full processor or from a held event loop. Each reading is optional.\n */\nexport interface SecondSample {\n /** This time is the start of the second, in ms from the start of the schedule. */\n readonly at: number;\n /** This share is the processor time of the process over the time of the sample. One full core reads 1. */\n readonly cpu?: number;\n /** This time is the p99 of the delay of the event loop in this second, in ms. */\n readonly loopP99?: number;\n /** This time is the largest delay of the event loop in this second, in ms. */\n readonly loopMax?: number;\n}\n\n/** This is the measure of one run of a schedule. Each list is in the order of the schedule. */\nexport interface LoadMeasure {\n readonly planned: number;\n /** This count is the number of arrivals that the driver did not send. */\n readonly unsent: number;\n /** This count is the number of arrivals that had no reply at the end of the run. */\n readonly unfinished: number;\n /** These times are the reply less the planned time: what a user waited. */\n readonly latency: readonly number[];\n /** These times are the reply less the send: the measure of a closed-loop driver. */\n readonly service: readonly number[];\n /** These times are the send less the planned time, for each arrival that the driver sent. */\n readonly lag: readonly number[];\n /** These times are the age at the end of each arrival with no reply. Each one is a lower bound of a latency. */\n readonly censored: readonly number[];\n /** These samples are the seconds that the driver read, in order of time. A run with no list of samples has no such field. */\n readonly seconds?: readonly SecondSample[];\n}\n\n/** This function throws a `RangeError` for a sample that a measure of this run cannot hold. */\nfunction checkSeconds(seconds: readonly SecondSample[], end: number): void {\n let last = Number.NEGATIVE_INFINITY;\n for (const { at, cpu, loopP99, loopMax } of seconds) {\n if (!(at >= 0 && at <= end && at > last)) throw new RangeError(`measureLoad: the sample at ${at} is not in order, in a run that stops at ${end}.`);\n last = at;\n for (const value of [cpu, loopP99, loopMax])\n if (value !== undefined && !(value >= 0 && Number.isFinite(value))) throw new RangeError(`measureLoad: the sample at ${at} has the reading ${value}.`);\n if (loopP99 !== undefined && loopMax !== undefined && loopMax < loopP99)\n throw new RangeError(`measureLoad: the sample at ${at} has a largest delay of ${loopMax} under its p99 of ${loopP99}.`);\n }\n}\n\n/**\n * This function gives the measure of a run. `end` is the end of the run, in ms from the start of the\n * schedule. It throws a `RangeError` for an index outside the schedule and for two completions of\n * one index. It throws the same error for a reply before its send and for a time past `end`.\n *\n * `seconds` is optional, and the measure holds it as given. A sample must be in order and inside the\n * run, and each reading must be finite and not negative. Otherwise the function throws the same error.\n */\nexport function measureLoad(plan: Schedule, completions: readonly Completion[], end: number, seconds?: readonly SecondSample[]): LoadMeasure {\n if (seconds !== undefined) checkSeconds(seconds, end);\n const byIndex = new Map<number, Completion>();\n for (const completion of completions) {\n if (!Number.isInteger(completion.index) || completion.index < 0 || completion.index >= plan.times.length)\n throw new RangeError(`measureLoad: the index ${completion.index} is not in the schedule of ${plan.times.length} arrivals.`);\n if (byIndex.has(completion.index)) throw new RangeError(`measureLoad: the index ${completion.index} has two completions.`);\n const last = completion.done ?? completion.sent;\n if (!(completion.sent <= last && last <= end))\n throw new RangeError(`measureLoad: the index ${completion.index} has a send at ${completion.sent} and a reply at ${completion.done}, in a run that stops at ${end}.`);\n byIndex.set(completion.index, completion);\n }\n const latency: number[] = [];\n const service: number[] = [];\n const lag: number[] = [];\n const censored: number[] = [];\n let unfinished = 0;\n plan.times.forEach((planned, index) => {\n const completion = byIndex.get(index);\n if (completion !== undefined) lag.push(completion.sent - planned);\n if (completion === undefined || completion.done === null) {\n if (completion !== undefined) unfinished += 1;\n censored.push(Math.max(0, end - planned));\n return;\n }\n latency.push(completion.done - planned);\n service.push(completion.done - completion.sent);\n });\n return { planned: plan.times.length, unsent: plan.times.length - byIndex.size, unfinished, latency, service, lag, censored, ...(seconds === undefined ? {} : { seconds }) };\n}\n\n/**\n * This function gives a quantile of the latency, with each arrival with no reply at its lower bound.\n * With a censored value, the result is a lower bound of the true quantile. It uses the nearest rank,\n * thus the result is a measured value. It throws a `RangeError` for a run with no arrivals.\n */\nexport function latencyQuantile(measure: LoadMeasure, p: number): number {\n return quantile([...measure.latency, ...measure.censored], p, \"nearest-rank\");\n}\n\n/** This is the check of a driver: the schedule held, or the reason that it did not. */\nexport interface ScheduleCheck {\n readonly held: boolean;\n /** This time is the largest size of a lag, or null with no send. */\n readonly worst: number | null;\n /** This count is the number of sends past the limit. */\n readonly late: number;\n readonly reason: string;\n}\n\n/**\n * This function tells if a driver kept the schedule: it sent each arrival, each within `limit` ms of\n * its planned time. A run that fails this check measures its driver, not the target, thus an A/A run\n * with no fault reads it first.\n */\nexport function scheduleHeld(measure: LoadMeasure, limit: number): ScheduleCheck {\n const worst = measure.lag.reduce<number | null>((most, lag) => Math.max(most ?? 0, Math.abs(lag)), null);\n const late = measure.lag.filter((lag) => Math.abs(lag) > limit).length;\n const held = measure.unsent === 0 && late === 0;\n const facts = `${measure.planned} planned, ${measure.unsent} not sent, ${late} past ${limit} ms, the worst ${worst ?? \"none\"} ms`;\n return { held, worst, late, reason: `The driver ${held ? \"kept\" : \"did not keep\"} the schedule (${facts}).` };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package",
|
|
3
3
|
"name": "@mark1russell7/rigor-chaos",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.1",
|
|
5
5
|
"description": "Open-loop load schedules with planned arrival times from a rate profile, and a measure of latency from the planned time with no coordinated omission.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"load",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@mark1russell7/rigor-generators": "^0.1.5",
|
|
42
|
-
"@mark1russell7/rigor-statistics": "^0.1.
|
|
42
|
+
"@mark1russell7/rigor-statistics": "^0.1.13"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@mark1russell7/cue": "^2.0.0",
|