Re: [PATCH] memcg: add interface to force disable swap

2 messages, 2 authors, 2023-10-08 · open the first message on its own page

Re: [PATCH] memcg: add interface to force disable swap

From: Huang, Ying <hidden>
Date: 2023-10-08 01:17:12

Jianlin Lv [off-list ref] writes:
From: Jianlin Lv <redacted>

Global reclaim will swap even if swappiness is set to 0.
Why?  Can you elaborate the situation?
In particular
case, users wish to be able to completely disable swap for specific
processes. One scenario is that if JVM memory pages falls into swap,
the performance will noticeably reduce and the GC pauses tend to increase
to levels not tolerable by most applications.
If it's possible to only disable swap out for specific processes, it can
address the JVM GC pauses issues, and at the same time, memory reclaim
pressure is also manageable.

This patch adds "memory.swap_force_disable" control file to support disable
swap for non-root cgroup. When process is associated with a cgroup,
'echo 1 > memory.swap_force_disable' will forbid anon pages be swapped out.
This patch also adds read and write handler of the control file.
--
Best Regards,
Huang, Ying

Re: [PATCH] memcg: add interface to force disable swap

From: Jianlin Lv <hidden>
Date: 2023-10-08 07:52:23

On Sun, Oct 8, 2023 at 9:17 AM Huang, Ying [off-list ref] wrote:
Jianlin Lv [off-list ref] writes:
quoted
From: Jianlin Lv <redacted>

Global reclaim will swap even if swappiness is set to 0.
Why?  Can you elaborate the situation?
We reproduced the issue of pages being swapped out even when swappiness is
set to 0 in the production environment through the following test program.
Not sure whether this program can reproduce the issue in any environment.

From the implementation of the get_scan_count code, it can be seen that,
based on the current runtime situation, memory reclamation will choose a
scanning method (SCAN_ANON/SCAN_FILE/SCAN_FRACT) to determine how
aggressively the anon and file LRU are scanned. However, this introduces
uncertainty.

For the JVM issue at hand, we expect deterministic SCAN_FILE scan to avoid
swapping out anon pages.


code::
#!/usr/bin/env python

import mmap
import os
import sys

def write_files():
    count = 1
    if not os.path.isdir(WRITE_DIR):
        os.mkdir(WRITE_DIR)

    while True:
        _, i = divmod(count, 6000)
        file = "{}/{}_{}.txt".format(WRITE_DIR, WRITE_FILE, i)

        with open(file, 'w') as f:
            # Write 100 MB to a file
            num_chars =  100 * 1024 * 1024
            f.write('0' * num_chars)
        count = count + 1

def create_read_file():
    with open(READ_FILE, 'wb') as f:
        num_chars = 10000 * 1024 * 1024
        f.write(b'0' * num_chars)

def read_file():
    with open(READ_FILE, mode="r", encoding="utf8") as f:
        mm = mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ)
        text = mm.read()
        write_files()

WRITE_FILE = "file"
WRITE_DIR = "/tmp/rm_rf_me"
READ_FILE="/tmp/10g_file_delete"
if not os.path.isfile(READ_FILE):
    create_read_file()
read_file()


Jianlin
quoted
In particular
case, users wish to be able to completely disable swap for specific
processes. One scenario is that if JVM memory pages falls into swap,
the performance will noticeably reduce and the GC pauses tend to increase
to levels not tolerable by most applications.
If it's possible to only disable swap out for specific processes, it can
address the JVM GC pauses issues, and at the same time, memory reclaim
pressure is also manageable.

This patch adds "memory.swap_force_disable" control file to support disable
swap for non-root cgroup. When process is associated with a cgroup,
'echo 1 > memory.swap_force_disable' will forbid anon pages be swapped out.
This patch also adds read and write handler of the control file.
--
Best Regards,
Huang, Ying
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help