From 2edbc077335b27d231fd58501ecf0090290764ac Mon Sep 17 00:00:00 2001 From: Christian Schwarz Date: Wed, 13 Mar 2024 15:03:24 +0000 Subject: [PATCH] experiment: demonstrate that std-fs performs better because it hits the page cache ... by forcing each write system call to go to disk test_bulk_insert[neon-release-pg14-tokio-epoll-uring].wal_written: 346 MB test_bulk_insert[neon-release-pg14-tokio-epoll-uring].wal_recovery: 92.559 s test_bulk_insert[neon-release-pg14-std-fs].wal_written: 346 MB test_bulk_insert[neon-release-pg14-std-fs].wal_recovery: 81.998 s => 10%ish worse instead of 2x --- pageserver/src/virtual_file/open_options.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pageserver/src/virtual_file/open_options.rs b/pageserver/src/virtual_file/open_options.rs index f75edb0bac..6952cf3194 100644 --- a/pageserver/src/virtual_file/open_options.rs +++ b/pageserver/src/virtual_file/open_options.rs @@ -1,7 +1,12 @@ //! Enum-dispatch to the `OpenOptions` type of the respective [`super::IoEngineKind`]; +use nix::libc::O_DSYNC; + use super::io_engine::IoEngine; -use std::{os::fd::OwnedFd, path::Path}; +use std::{ + os::{fd::OwnedFd, unix::fs::OpenOptionsExt}, + path::Path, +}; #[derive(Debug, Clone)] pub enum OpenOptions { @@ -94,12 +99,14 @@ impl OpenOptions { } pub(in crate::virtual_file) async fn open(&self, path: &Path) -> std::io::Result { - match self { + let mut options = self.clone(); + options.custom_flags(O_DSYNC); // disk latency + match options { OpenOptions::StdFs(x) => x.open(path).map(|file| file.into()), #[cfg(target_os = "linux")] OpenOptions::TokioEpollUring(x) => { let system = tokio_epoll_uring::thread_local_system().await; - system.open(path, x).await.map_err(|e| match e { + system.open(path, &x).await.map_err(|e| match e { tokio_epoll_uring::Error::Op(e) => e, tokio_epoll_uring::Error::System(system) => { std::io::Error::new(std::io::ErrorKind::Other, system)