in rd-agent/src/side/inodesteal-test.py [0:0]
def one_round(inodesteal_target, prefix):
with open("/proc/sys/vm/drop_caches", "w") as f:
f.write("3")
mi = read_meminfo()
mem_free = mi["MemFree"]
swap_free = mi["SwapFree"]
target_swap = min(1 << 30, swap_free / 2)
target_swap_free = swap_free - target_swap
print(f"{prefix}mem_free={mem_free/GIG:.2f}G swap_free={swap_free/GIG:.2f}G target_swap={target_swap/GIG:.2f}G",
file=sys.stderr, flush=True)
# Instantiate inode cache and revisit to activate.
for i in range(2):
for j in range(NR_FILES):
with open(TF_DIR + f"/{j}", "r") as f:
f.read()
# Add some inactive page cache.
with open(TF_DIR + "/inactive", "w+") as f:
f.truncate(2 * target_swap)
f.read()
# Balloon up in 256M increments until swap_free falls below target_swap_free.
last_at = time.time()
mms = []
while True:
mm = mmap.mmap(-1, CHUNK_PAGES * 4096, flags=mmap.MAP_PRIVATE)
for i in range(CHUNK_PAGES):
mm[i * 4096] = 1
mi = read_meminfo()
mms.append(mm)
if mi["SwapFree"] < target_swap_free:
break
if time.time() >= last_at + 1:
print(f"{prefix}Allocated {len(mms) * NR_MMS_TO_GIGS:.2f}G swap_free={mi['SwapFree'] / GIG:.2f}G",
file=sys.stderr, flush=True)
last_at = time.time()
print(f"{prefix}Finished allocating {len(mms) * NR_MMS_TO_GIGS:.2f}G swap_free={mi['SwapFree'] / GIG:.2f}G",
file=sys.stderr, flush=True)
# Give some of the mmapped pages a round of read. We just wanna dip into
# swap a bit. Read half of the target swap usage.
last_at = time.time()
nr_to_read = min(math.ceil(2 * target_swap / CHUNK_SIZE / 2), len(mms))
for i in range(nr_to_read):
for j in range(CHUNK_PAGES):
mms[i][j * 4096]
if read_inodesteal() >= inodesteal_target:
return True
if time.time() >= last_at + 1:
print(f"{prefix}Accessed {i * NR_MMS_TO_GIGS:.2f}G",
file=sys.stderr, flush=True)
return False