Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion tests/madvise/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@

## Prerequisite
This framework depends on IAA RFC kernel patches. Please see more instructions here. https://github.com/intel-innersource/applications.benchmarking.memory-usage-analyzer/wiki/Integration-of-IAA-RFC-patches-to-upstream-kernel
## Run in Baremetal

## Quick swap-in/swap-out test
This test will show the swap-in and swap-out latency to do a sanity check for lzo and deflate-iaa
./benchmark.sh

## Detailed Analysis for batching (currently broken)
1. Run
```
./make_swap_space.sh
Expand Down
67 changes: 67 additions & 0 deletions tests/madvise/madvise_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <unistd.h>
#include <sys/mman.h>
#include <linux/mman.h>
#include <sys/resource.h>
#include <time.h>

#ifndef MADV_PAGEOUT
Expand All @@ -22,6 +23,51 @@ extern inline long _now() {
return now.tv_sec * 1000000000 + now.tv_nsec;
}

static inline long tv_to_ns(const struct timeval *tv) {
return tv->tv_sec * 1000000000L + tv->tv_usec * 1000L;
}

long read_sysfs_long(const char *path) {
FILE *fp = fopen(path, "r");
if (!fp) return 0;
char buf[64];
if (!fgets(buf, sizeof(buf), fp)) { fclose(fp); return 0; }
fclose(fp);
return atol(buf);
}

/*
* Read zram mm_stat: "orig_data_size compr_data_size mem_used_total ..."
* Also try zswap sysfs as fallback.
*/
void read_zpool_stats(long *orig_data, long *mem_used) {
*orig_data = 0;
*mem_used = 0;

const char *zpool_source = getenv("ZPOOL_SOURCE");
int force_zswap = (zpool_source && strcmp(zpool_source, "zswap") == 0);
int force_zram = (zpool_source && strcmp(zpool_source, "zram") == 0);

if (!force_zswap) {
/* Try zram first unless zswap is explicitly requested. */
FILE *fp = fopen("/sys/block/zram0/mm_stat", "r");
if (fp) {
fscanf(fp, "%ld %*ld %ld", orig_data, mem_used);
fclose(fp);
return;
}

if (force_zram)
return;
}

/* Fallback to zswap */
long stored = read_sysfs_long("/sys/kernel/debug/zswap/stored_pages");
long pool = read_sysfs_long("/sys/kernel/debug/zswap/pool_total_size");
*orig_data = stored * 4096;
*mem_used = pool;
}

int main(int argc, char **argv)
{
int i, nr_pages = 1;
Expand All @@ -45,18 +91,35 @@ int main(int argc, char **argv)
}

/* Tell kernel to swap it out */
struct rusage ru0_out, ru1_out;
getrusage(RUSAGE_SELF, &ru0_out);
long time_ns = _now();
int status = madvise(addr, nr_pages * PAGE_SIZE, MADV_PAGEOUT);
long swap_out_time_total_ns=_now() - time_ns;
getrusage(RUSAGE_SELF, &ru1_out);
long swap_out_sys_total_ns = tv_to_ns(&ru1_out.ru_stime) - tv_to_ns(&ru0_out.ru_stime);
long swap_out_time_avg_ns= swap_out_time_total_ns/nr_pages;
long swap_out_sys_avg_ns = swap_out_sys_total_ns/nr_pages;
printf("Swapping out %d pages from %lx, ret = %d\n", nr_pages, addr, status);
printf("swap_out: total=%d average=%d\n", swap_out_time_total_ns, swap_out_time_avg_ns);
printf("swap_out_sys: total=%d average=%d\n", swap_out_sys_total_ns, swap_out_sys_avg_ns);

/* Wait for swap out to finish */
sleep(2);

/* Report zpool stats while pages are still compressed */
long orig_data = 0, mem_used = 0;
read_zpool_stats(&orig_data, &mem_used);
long stored_pages = orig_data / 4096;
double comp_ratio = (mem_used > 0) ? (double)orig_data / mem_used : 0;
printf("zpool_stored_pages: %ld\n", stored_pages);
printf("zpool_total_size: %ld\n", mem_used);
printf("zpool_comp_ratio: %.2f\n", comp_ratio);

printf("Swapping in %d pages\n", nr_pages);

struct rusage ru0_in, ru1_in;
getrusage(RUSAGE_SELF, &ru0_in);
time_ns = _now();
a = addr;
/* Access the page ... this will swap it back in again */
Expand All @@ -66,7 +129,11 @@ int main(int argc, char **argv)
a += PAGE_SIZE;
}
long swap_in_time_total_ns=_now() - time_ns;
getrusage(RUSAGE_SELF, &ru1_in);
long swap_in_sys_total_ns = tv_to_ns(&ru1_in.ru_stime) - tv_to_ns(&ru0_in.ru_stime);
long swap_in_time_avg_ns= swap_in_time_total_ns/nr_pages;
long swap_in_sys_avg_ns = swap_in_sys_total_ns/nr_pages;
printf("swap_in: total=%d average=%d\n", swap_in_time_total_ns, swap_in_time_avg_ns);
printf("swap_in_sys: total=%d average=%d\n", swap_in_sys_total_ns, swap_in_sys_avg_ns);

}
Loading