Skip to content

Commit bef5cfe

Browse files
authored
perf: enable io_uring engine on Linux platform (#120)
enable io_uring engine on Linux platform
1 parent 1f75b65 commit bef5cfe

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

crates/core/src/engine.rs

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use foyer::LfuConfig;
3030
use foyer::PsyncIoEngineBuilder;
3131
use foyer::RecoverMode;
3232
use foyer::RuntimeOptions;
33+
use foyer::TokioRuntimeOptions;
3334
use mixtrics::registry::noop::NoopMetricsRegistry;
3435
use mixtrics::registry::opentelemetry_0_31::OpenTelemetryMetricsRegistry;
3536
use parse_display::Display;
@@ -92,6 +93,34 @@ impl FoyerEngine {
9293
.build()
9394
.map_err(|err| EngineError(format!("failed to create device: {err}")))?;
9495

96+
let psync_io_engine = PsyncIoEngineBuilder::new()
97+
.build()
98+
.await
99+
.map_err(|err| EngineError(err.to_string()))?;
100+
101+
let io_engine = {
102+
#[cfg(target_os = "linux")]
103+
{
104+
use foyer::UringIoEngineBuilder;
105+
106+
UringIoEngineBuilder::new()
107+
.with_sqpoll(true)
108+
.build()
109+
.await
110+
.inspect_err(|e| {
111+
log::warn!(
112+
"failed to build io_uring engine, fallback to psync engine: {e}"
113+
);
114+
})
115+
.unwrap_or(psync_io_engine)
116+
}
117+
118+
#[cfg(not(target_os = "linux"))]
119+
{
120+
psync_io_engine
121+
}
122+
};
123+
95124
let parallelism = num_cpus().get();
96125
let cache = HybridCacheBuilder::new()
97126
.with_policy(HybridCachePolicy::WriteOnEviction)
@@ -114,14 +143,12 @@ impl FoyerEngine {
114143
.with_block_size(DEFAULT_BLOCK_SIZE.0 as usize)
115144
.with_flushers(DEFAULT_FLUSHERS),
116145
)
117-
.with_io_engine(
118-
PsyncIoEngineBuilder::new()
119-
.build()
120-
.await
121-
.map_err(|err| EngineError(err.to_string()))?,
122-
)
146+
.with_io_engine(io_engine)
123147
.with_recover_mode(RecoverMode::Quiet)
124-
.with_runtime_options(RuntimeOptions::Unified(Default::default()))
148+
.with_runtime_options(RuntimeOptions::Unified(TokioRuntimeOptions {
149+
worker_threads: 4,
150+
max_blocking_threads: num_cpus().get() * 2,
151+
}))
125152
.build()
126153
.await
127154
.map_err(|err| EngineError(err.to_string()))?;

crates/server/src/middleware.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ pub struct RateLimitMiddleware {
143143

144144
impl RateLimitMiddleware {
145145
pub fn new() -> Self {
146-
let run_limit = num_cpus().get() * 100;
147-
let wait_limit = run_limit * 5;
146+
let run_limit = num_cpus().get() * 4;
147+
let wait_limit = run_limit * 100;
148148

149149
Self {
150150
wait_permit: Arc::new(Semaphore::new(wait_limit)),

0 commit comments

Comments
 (0)