I've recently discovered weird behaviour of EV-loop timers.
First in Tarantool, and now in Perl libev.
Subj:
When asking EV-loop to sleep for 1ms, it does 1.2ms when requesting to sleep for 2ms, it does 2.4ms,
use strict; | |
use warnings; | |
use feature 'say'; | |
use Module::CoreList; | |
use Pod::Simple::SimpleTree; | |
use List::Util qw(first); | |
# 1 - only standard level modules | |
# 2 - mostly all packages | |
# 3 - subpackages of packages |
#!/usr/bin/env tarantool | |
local json = require('json') | |
local cluster_config = require('internal.config.cluster_config') | |
local scalars = {} | |
scalars.string = { | |
jsonschema = { | |
type = 'string', |
use std::collections::HashMap; | |
use serde::{Deserialize, Serialize}; | |
use tarantool::{self, session, tuple::Encode}; | |
use mlua::Lua; | |
#[tarantool::proc] | |
fn add(left: i64, right: i64) -> i64 { | |
left + right | |
} |
-- Tarantool 3.0.2-0-gf9e82c5 Darwin-arm64-RelWithDebInfo | |
local fiber = require 'fiber' | |
local clock = require 'clock' | |
local log = require 'log' | |
box.cfg{checkpoint_count = 1,listen=3301} | |
box.ctl.promote() | |
require 'jit'.on() | |
fiber.top_enable() |
--[[ | |
cpu limit is like leaking bucket. | |
we say that we want to limit this iterator to consume ≤10% cpu. | |
Caller: | |
- ev(), real() | |
- gen_x(param_x, state_x) | |
- ev(), real() |
local fiber = require 'fiber' | |
local clock = require 'clock' | |
local fun = require 'fun' | |
require 'jit'.on() | |
fiber.top_enable() | |
local COLLECT_INTERVAL = 1 | |
fiber.create(function() | |
fiber.name("monitor") |
{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"fiber":{"type":"object","additionalProperties":false,"properties":{"io_collect_interval":{"type":"number","default":null},"too_long_threshold":{"type":"number","default":0.5},"top":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","default":false}}},"slice":{"type":"object","additionalProperties":false,"properties":{"err":{"type":"number","default":1},"warn":{"type":"number","default":0.5}}},"worker_pool_threads":{"type":"number","default":4}}},"wal":{"type":"object","additionalProperties":false,"properties":{"queue_max_size":{"type":"integer","default":16777216},"dir_rescan_delay":{"type":"number","default":2},"dir":{"type":"string","default":"var/lib/{{ instance_name }}"},"ext":{"type":"object","properties":{"spaces":{"type":"object","additionalProperties":{"type":"object","additionalProperties":false,"properties":{"old":{"type":"boolean","default":false |
require 'compat'.json_escape_forward_slash = 'new' | |
local log = require 'log' | |
local json = require 'json' | |
local netbox = require 'net.box' | |
local router = netbox.connect('127.0.0.1:4401') | |
log.info("call_raw: %s", json.encode(router:call('call_raw'))) | |
log.info("call_noraw: %s", json.encode(router:call('call_noraw'))) | |
--[[ |
tarantool> require'tarantool' | |
--- | |
- build: &0 | |
target: Darwin-arm64-Release | |
options: cmake . -DCMAKE_INSTALL_PREFIX=/opt/homebrew/Cellar/tarantool/2.11.0_1 | |
-DENABLE_BACKTRACE=TRUE | |
linking: dynamic | |
mod_format: dylib | |
flags: ' -fexceptions -funwind-tables -fasynchronous-unwind-tables -fno-common | |
-fopenmp -Wformat -Wformat-security -Werror=format-security -fstack-protector-strong |