perf_hooks.performance.timerify() with histogram: RangeError [ERR_OUT_OF_RANGE] on arm64
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- JavaScript
- Star
- 122k
- Fork
- 37.4k
- Merge trung bình
- 4 ngày 3 giờ
- Pull request đã merge (30 ngày)
- 272
Mô tả
Version
v14, v16, v17, v18
Platform
macOS v12.4 (21F79).
Darwin 21.5.0 Darwin Kernel Version 21.5.0: Tue Apr 26 21:08:37 PDT 2022; root:xnu-8020.121.3~4/RELEASE_ARM64_T6000 arm64
Subsystem
perf_hooks
What steps will reproduce the bug?
Run this snippet:
import {createHistogram, performance} from 'node:perf_hooks';
const fn = () => {};
const timerified = performance.timerify(fn, {histogram: createHistogram()});
for (let i = 0; i < 100_000; i++) {
try {
timerified();
} catch (error) {
console.error('Crashed on iteration', i);
throw error;
}
}
How often does it reproduce? Is there a required condition?
100% consistent reproduction, requires arm64, maybe requires macOS.
What is the expected behavior?
Calling the timerified function returned from perf_hooks.performance.timerify() should successfully record to the histogram.
What do you see instead?
node:internal/errors:466
ErrorCaptureStackTrace(err);
^
RangeError [ERR_OUT_OF_RANGE]: The value of "val" is out of range. It must be a safe integer greater than 0. Received 0
at new NodeError (node:internal/errors:377:5)
at RecordableHistogram.record (node:internal/histogram:290:13)
at processComplete (node:internal/perf/timerify:40:15)
at timerified fn (node:internal/perf/timerify:88:5)
at file:///Users/jonah/programming/benchmark/index.mjs:9:3
at ModuleJob.run (node:internal/modules/esm/module_job:198:25)
at async Promise.all (index 0)
at async ESMLoader.import (node:internal/modules/esm/loader:409:24)
at async loadESM (node:internal/process/esm_loader:85:5)
at async handleMainPromise (node:internal/modules/run_main:61:12) {
code: 'ERR_OUT_OF_RANGE'
}
Node.js v18.1.0
Additional information
Originally reported here: https://github.com/sindresorhus/yoctocolors/pull/9#issuecomment-1019033882
The bug appears to be from the implementation of perf_hooks.performance.timerify() with a histogram, when calling the returned timerified function. The error comes from the input validation of RecordableHistogram#record(), attempting to record a value x < 1 will throw. For whatever reason timerify() seems to be recording an execution duration of 0 and trying to record that. See the error stacktrace for more info.
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu bằng cách tái hiện snippet trên arm64, sau đó kiểm tra internal/perf/timerify và internal/histogram, đặc biệt là processComplete và RecordableHistogram.record như được thể hiện trong stack trace. Công việc được xem là hoàn tất khi timerify() ghi nhận việc thực thi mà không ném ERR_OUT_OF_RANGE và hành vi này được bao phủ bằng một regression test phù hợp.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- javascript, nodejs
- Lĩnh vực
- backend, performance
- Loại issue
- Lỗi
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức độ hoạt động
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 48/100