스왑 파티션을 테스트하는 방법

스왑 파티션을 테스트하는 방법

헤드리스 서버에서 임의의 세그폴트를 진단하려고 하는데 이상해 보이는 한 가지 사실은 메모리 부족 상황에서만 발생하는 것처럼 보이고 스왑 크기가 0을 초과하지 않는다는 것입니다.

내 컴퓨터가 제대로 작동하는지 확인하기 위해 강제로 교체하려면 어떻게 해야 합니까?

orca ~ # free
             total       used       free     shared    buffers     cached
Mem:       1551140    1472392      78748          0     333920    1046368
-/+ buffers/cache:      92104    1459036
Swap:      1060280          0    1060280

orca ~ # swapon -s
Filename                                Type            Size    Used    Priority
/dev/sdb2                               partition       1060280 0       -1

답변1

이게 리눅스인가요? 그렇다면 다음을 시도해 볼 수 있습니다.

# sysctl vm.swappiness=100

(기본값을 확인하기 위해 먼저 이것을 사용하고 싶을 수도 있습니다 sysctl vm.swappiness. 내 시스템에서는 10)

그런 다음 많은 RAM을 사용하는 프로그램을 사용하거나 RAM만 사용하는 작은 애플리케이션을 작성하세요. 다음은 이를 수행합니다(출처:Linux 디스크 캐싱을 통한 실험과 재미):

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <unistd.h>


int main(int argc, char** argv) {
    int max = -1;
    int mb = 0;
    int multiplier = 1; // allocate 1 MB every time unit. Increase this to e.g.100 to allocate 100 MB every time unit.
    char* buffer;

    if(argc > 1)
        max = atoi(argv[1]);

    while((buffer=malloc(multiplier * 1024*1024)) != NULL && mb != max) {
        memset(buffer, 1, multiplier * 1024*1024);
        mb++;
        printf("Allocated %d MB\n", multiplier * mb);
        sleep(1); // time unit: 1 second
    }      
    return 0;
}

Linux 가상 메모리 관리자는 실제로 RAM을 할당하지 않을 만큼 똑똑할 수 있으므로 블록을 0 대신 1로 초기화하도록 memset 행을 코딩합니다. 메모리를 소모하고 스왑하는 과정을 지켜볼 시간을 더 주기 위해 sleep(1)을 추가했습니다. 프로그램에 제공할 RAM 및 SWAP이 충분하지 않으면 OOM 킬러가 프로그램을 종료합니다. 다음 명령으로 컴파일할 수 있습니다.

gcc filename.c -o memeater

여기서 filename.c는 위 프로그램을 저장한 파일입니다. 그런 다음 ./memeater를 사용하여 실행할 수 있습니다.

나는 생산 기계에서는 이것을하지 않을 것입니다.

답변2

이 문서의 테스트를 실행하려면 다음이 필요합니다.

첫 번째 테스트에서는 정상적인 상황에서 스왑 파티션을 정상적으로 읽고 쓸 수 있는지 확인해야 합니다. 다음 명령을 실행하여 이를 수행할 수 있습니다. amount_of_swap실제 보유하고 있는 환전 금액으로 변경하는 것을 잊지 마세요 . timeout교환이 특히 느리거나 큰 경우에도 증가해야 할 수도 있습니다.

$ amount_of_swap=2G
$ timeout=60
$ systemd-run --property="MemoryHigh=128M" -- \
    stress-ng \
        --timeout "$timeout" \
        --vm 1 \
        --vm-hang 0 \
        --vm-method zero-one \
        --vm-bytes "$amount_of_swap"
Running as unit: run-u7.service
$ # Wait for it to start using swap, then run:
$ free
               total        used        free      shared  buff/cache   available
Mem:          479432      345384       19136        3284      114912      117948
Swap:        2097148     1975096      122052
$ # Make sure that stress-ng exited successfully:
$ unit_name=run-u7.service  # This might be different on your system. See systemd-run’s output.
$ journalctl --boot --unit="$unit_name"
Started /nix/store/fmsawx6292lg2mc96hj5gmql1mk973dz-stress-ng-0.17.01/bin/stress-ng --timeout 60 --vm 1 --vm-hang 0 --vm-method zero-one --vm-bytes 2G.
invoked with '/nix/store/fmsawx6292lg2mc96hj5gmql1mk973dz-stress-ng-0.17.01/bin/stress-ng --timeout 60 --vm 1 --vm-hang 0 --vm-method zero-one --vm-bytes 2G' by user 0 'root'
stress-ng: info:  [2237] setting to a 1 min, 0 secs run per stressor
stress-ng: info:  [2237] dispatching hogs: 1 vm
system: 'jasonyundt' Linux 6.8.1 #1-NixOS SMP PREEMPT_DYNAMIC Fri Mar 15 18:19:29 UTC 2024 x86_64
memory (MB): total 468.20, free 127.03, shared 3.21, buffer 1.59, swap 2048.00, free swap 2046.73
stress-ng: info:  [2237] skipped: 0
stress-ng: info:  [2237] passed: 1: vm (1)
stress-ng: info:  [2237] failed: 0
stress-ng: info:  [2237] metrics untrustworthy: 0
stress-ng: info:  [2237] successful run completed in 1 min, 3.96 secs
run-u7.service: Deactivated successfully.
run-u7.service: Consumed 28.368s CPU time, no IP traffic.

free명령의 출력에는 스왑이 실제로 사용되었는지 여부가 표시됩니다.


대부분의 경우 이전 테스트로 충분합니다. 불행하게도 커널에 메모리가 부족해지면 커널이 사용할 수 없는 스왑 영역이 생성될 수 있습니다. 구체적으로 이하인 경우min_free_kbytes사용 가능한 메모리가 남아 있으면 커널은 최소 메모리 비상 모드로 들어갑니다.PF_MEMALLOC할당이 허용됩니다. 스왑 장치나 스왑 파일에 쓰기 위해 비 PF_MEMALLOC메모리 할당이 필요한 경우 RAM을 너무 많이 사용하면 시스템이 충돌합니다.

다음을 통해 한계에 도달하면 min_free_kbytes시스템이 중단되는지 여부를 테스트할 수 있습니다.

#!/usr/bin/env bash
# Again, remember to potentially adjust amount_of_ram and timeout.
amount_of_ram=1G
timeout=60

original_min_free_kbytes="$(sysctl -n vm.min_free_kbytes)"
sudo -v
{
    sleep "$(( timeout / 2 ))"
    free
    sudo sysctl vm.min_free_kbytes="$(( 128 * 1024 ))"
} &
stress-ng \
    --timeout "$timeout" \
    --vm 1 \
    --vm-hang 0 \
    --vm-method zero-one \
    --vm-bytes "$amount_of_ram" &
wait

sudo sysctl vm.min_free_kbytes="$original_min_free_kbytes"

시스템이 정상이면 스크립트가 성공적으로 종료됩니다. 시스템 PF_MEMALLOC에서 스와핑을 위해 비메모리 할당이 필요한 경우이것일어날 것이다:

[ 1106.923468] INFO: task systemd:1 blocked for more than 122 seconds.
[ 1106.924018]       Tainted: G        W          6.8.1 #1-NixOS
[ 1106.924512] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.
[ 1106.925344] INFO: task kthreadd:2 blocked for more than 122 seconds.
[ 1106.925876]       Tainted: G        W          6.8.1 #1-NixOS
[ 1106.926356] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.
[ 1106.927188] INFO: task kworker/u2:0:11 blocked for more than 122 seconds.
[ 1106.927757]       Tainted: G        W          6.8.1 #1-NixOS
[ 1106.928234] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.
[ 1106.929447] INFO: task kworker/u2:1:23 blocked for more than 122 seconds.
[ 1106.930018]       Tainted: G        W          6.8.1 #1-NixOS
[ 1106.930506] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.
[ 1106.931598] INFO: task kswapd0:37 blocked for more than 122 seconds.
[ 1106.932129]       Tainted: G        W          6.8.1 #1-NixOS
[ 1106.932619] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.
[ 1106.933396] INFO: task kworker/0:3:139 blocked for more than 122 seconds.
[ 1106.933968]       Tainted: G        W          6.8.1 #1-NixOS
[ 1106.934452] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.
[ 1106.935430] INFO: task systemd-udevd:425 blocked for more than 122 seconds.
[ 1106.936051]       Tainted: G        W          6.8.1 #1-NixOS
[ 1106.936611] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.
[ 1106.937482] INFO: task systemd-oomd:578 blocked for more than 122 seconds.
[ 1106.938077]       Tainted: G        W          6.8.1 #1-NixOS
[ 1106.938582] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.
[ 1106.939438] INFO: task systemd-timesyn:605 blocked for more than 122 seconds.
[ 1106.940063]       Tainted: G        W          6.8.1 #1-NixOS
[ 1106.940572] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.
[ 1106.941436] INFO: task kworker/0:5:642 blocked for more than 122 seconds.
[ 1106.942028]       Tainted: G        W          6.8.1 #1-NixOS
[ 1106.942539] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.

관련 정보