Skip to content

Commit 635a215

Browse files
authored
chore(rust): Add force_populate_read for debugging pagefault performance problems (#21054)
1 parent 480edbc commit 635a215

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

crates/polars-stream/src/nodes/io_sources/parquet/mem_prefetch_funcs.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
pub(super) use polars_utils::mem::{
2-
madvise_populate_read, madvise_sequential, madvise_willneed, prefetch_l2,
2+
force_populate_read, madvise_populate_read, madvise_sequential, madvise_willneed, prefetch_l2,
33
};
44
pub(super) fn no_prefetch(_: &[u8]) {}
55

@@ -51,6 +51,7 @@ pub(super) fn get_memory_prefetch_func(verbose: bool) -> fn(&[u8]) -> () {
5151
);
5252
}
5353
},
54+
Some("force_populate_read") => force_populate_read,
5455
Some(v) => panic!("invalid value for POLARS_MEMORY_PREFETCH: {}", v),
5556
};
5657

@@ -61,6 +62,7 @@ pub(super) fn get_memory_prefetch_func(verbose: bool) -> fn(&[u8]) -> () {
6162
v if v == madvise_sequential as usize => "madvise_sequential",
6263
v if v == madvise_willneed as usize => "madvise_willneed",
6364
v if v == madvise_populate_read as usize => "madvise_populate_read",
65+
v if v == force_populate_read as usize => "force_populate_read",
6466
_ => unreachable!(),
6567
};
6668

crates/polars-utils/src/mem.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,15 @@ pub fn madvise_populate_read(#[allow(unused)] slice: &[u8]) {
7171
madvise(slice, libc::MADV_POPULATE_READ);
7272
}
7373

74+
/// Forcibly reads at least one byte each page.
75+
pub fn force_populate_read(slice: &[u8]) {
76+
for i in (0..slice.len()).step_by(*PAGE_SIZE) {
77+
std::hint::black_box(slice[i]);
78+
}
79+
80+
std::hint::black_box(slice.last().copied());
81+
}
82+
7483
#[cfg(target_family = "unix")]
7584
fn madvise(slice: &[u8], advice: libc::c_int) {
7685
let ptr = slice.as_ptr();

0 commit comments

Comments
 (0)