추가 읽기

추가 읽기

나는 Debian(Buster) 노트북을 가지고 있습니다.8GBRAM 및 16GB 스왑. 나는 매우 오랫동안 실행되는 작업을 실행하고 있습니다. 이는 내 노트북이 지난 6일 동안 켜져 있었음을 의미합니다.

이 작업을 하면서 주기적으로 노트북을 노트북처럼 사용해야 합니다. 이는 문제가 되지 않습니다. 장기 실행 작업은 I/O에 바인딩되어 있고, USB 하드 드라이브의 콘텐츠에서 작업하며, RAM(<200MB) 또는 CPU(<4%)를 많이 사용하지 않습니다.

문제는몇 시간 후에 노트북을 다시 사용하면 속도가 매우 느려지고 정상으로 돌아오는 데 30분 정도 걸립니다. 이는 매우 심각하여 충돌 모니터가 해당 응용 프로그램(특히 브라우저 창)을 정지된 것으로 표시하고 잘못 충돌하기 시작했습니다.

시스템 모니터를 보면 사용된 2.5GB 중 절반 정도가 스왑으로 옮겨졌습니다. 스왑 공간( )을 삭제하여 문제임을 확인했습니다 swapoff /dev/sda8. 스왑 공간 없이 그대로 두면 24시간이 지나도 거의 즉시 다시 살아납니다. 교체하면 처음 5분 동안은 사실상 브릭이고 남은 시간은 6시간뿐입니다. 메모리 사용량이 절대 초과되지 않는 것을 확인했습니다3GB내가 주변에 없더라도.

줄여보았습니다교환성(참조: 위키피디아) 10을 및 의 값 으로 변경 0했지만 문제는 남아 있습니다. 하루 동안 활동이 없으면 커널은 전체 GUI가 더 이상 필요하지 않다고 결정하고 이를 RAM에서 삭제합니다(디스크로 교체). 장기 실행 작업은 거대한 파일 트리를 읽고 각 파일을 읽는 것입니다. 따라서 커널은 캐싱이 도움이 될 것이라고 잘못 생각할 수 있습니다. 그러나 한 번에 약 10억 개의 파일 이름이 포함된 2TB USB HD를 스캔할 때 추가 GB RAM은 성능에 큰 도움이 되지 않았습니다. 이것은 느린 하드 드라이브를 갖춘 저렴한 노트북입니다. 단순히 데이터를 RAM에 충분히 빠르게 다시 로드할 수 없습니다.

긴급 상황에서만 스왑 공간을 사용하도록 Linux에 지시하는 방법은 무엇입니까?나는 스왑 없이 달리고 싶지 않습니다. 예상치 못한 일이 발생하고 OS에 갑자기 몇 GB가 추가로 필요한 경우 작업이 중단되는 것을 원하지 않으며 스왑을 사용하는 것을 선호합니다. 하지만 현재 스왑을 활성화하면 필요할 때 노트북을 사용할 수 없습니다.

“긴급상황”의 정확한 정의는 논란의 여지가 있습니다. 하지만 제가 의미하는 바를 명확히 하자면, 패닉은 시스템에 프로세스를 교체하거나 종료하는 것 외에는 다른 옵션이 없을 때입니다.


긴급 상황이란 무엇입니까?-꼭 물어봐야 하나요? ...불타고 있는 건물 안에 있는 자신을 발견하지 않기를 바랍니다!

이 질문에서 긴급 상황을 구성할 수 있는 모든 것을 정의하는 것은 불가능합니다. 그러나 예를 들어 커널이 너무 많은 메모리를 필요로 하여 다음을 사용하여 프로세스를 종료하기 시작하는 경우 패닉 상황이 발생할 수 있습니다.메모리 오버플로 킬러. 커널이 스왑을 사용하여 성능을 향상시킬 수 있다고 생각할 때 패닉은 없습니다.


최종 편집: OS 수준에서 요청한 것과 정확히 일치하는 답변을 수락했습니다. 미래의 독자들은 애플리케이션 수준 솔루션을 제공하는 답변도 참고해야 합니다.

답변1

한 가지 해결 방법은 메모리 cgroup 컨트롤러가 활성화되어 있는지 확인하는 것입니다(새 커널에서도 기본값인 것 같습니다. 그렇지 않으면 cgroup_enable=memory커널 명령줄에 추가해야 합니다). 그런 다음 메모리 제한이 있는 cgroup에서 I/O 집약적인 작업을 실행할 수 있으며, 이로 인해 사용할 수 있는 캐시 양도 제한됩니다.

systemd를 사용하는 경우 이를 포함하는 유닛이나 슬라이스에서 +MemoryAccounting=yes/ MemoryHigh또는 를 설정할 수 있습니다 MemoryMax( MemoryLimitcgroup v1 또는 v2를 사용하는지 여부에 따라 다름). 슬라이스인 경우 systemd-run해당 슬라이스에서 프로그램을 실행하는 데 사용할 수 있습니다.

메모리 제약 하에서 Firefox를 실행하기 위한 내 시스템 중 하나의 전체 예입니다. cgroups v2를 사용하고 루트가 아닌 내 사용자로 설정됩니다(v1에 비해 v2의 장점 중 하나는 루트가 아닌 사용자에게 위임하는 것이 안전하므로 systemd가 이를 수행한다는 것입니다).

$ systemctl --user cat mozilla.slice 
# /home/anthony/.config/systemd/user/mozilla.slice
[Unit]
Description=Slice for Mozilla apps
Before=slices.target

[Slice]
MemoryAccounting=yes
MemoryHigh=5G
MemoryMax=6G

$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/firefox &
$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/thunderbird &

사용자를 위해 작동하게 하려면 슬라이싱을 사용해야 한다는 것을 알았습니다. 시스템 1은 옵션을 서비스 파일에 넣거나 systemctl set-property서비스에서 사용하면 작동합니다.

이것은 샘플 서비스(cgroup v1 사용)입니다. 마지막 두 줄을 참고하세요. 이는 시스템(pid=1) 인스턴스의 일부입니다.

[Unit]
Description=mount S3QL filesystem
Requires=network-online.target
After=network-online.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
User=s3ql-user
Group=s3ql-user
LimitNOFILE=20000
ExecStartPre=+/bin/sh -c 'printf "S3QL_CACHE_SIZE=%%i\n" $(stat -c "%%a*%%S*.90/1024" -f /srv/s3ql-cache/ | bc) > /run/local-s3ql-env'
ExecStartPre=/usr/bin/fsck.s3ql  --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo  --log none «REDACTED»
EnvironmentFile=-/run/local-s3ql-env
ExecStart=/usr/bin/mount.s3ql --keep-cache --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo --cachesize ${S3QL_CACHE_SIZE} --threads 4
ExecStop=/usr/bin/umount.s3ql /mnt/S3QL/
TimeoutStopSec=2m
MemoryAccounting=yes
MemoryLimit=1G

설명서는 에 있습니다 systemd.resource-control(5).

답변2

오늘날 그렇게 큰 규모의 교환을 하는 것은 일반적으로 나쁜 생각입니다. OS가 몇 GB의 메모리만 교체하면 시스템은 크롤링되어 사망합니다(보시다시피).

즐겨사용zram작은 백업 스왑 파티션이 있어야 합니다.. 다음과 같은 많은 운영 체제크롬OS, Android 및 다양한 Linux 배포판(루분투,페도라 모자) zram은 특히 RAM이 적은 시스템의 경우 수년 동안 기본적으로 활성화되었습니다. 그것은훨씬 더 빨리이 경우 하드 드라이브를 교체하는 것과 비교했을 때 시스템이 얼마나 반응하는지 확실히 느낄 수 있습니다. 이는 SSD에서는 덜 사실이지만,벤치마크 결과는 여기에 있습니다.기본 lzo 알고리즘을 사용하더라도 여전히 더 빠른 것 같습니다. 다음으로 변경할 수 있습니다.lz4약간 낮은 압축률로 더 나은 성능을 얻으십시오. 디코딩 속도는공식 벤치마크에 따르면 lzo보다 거의 5배 빠릅니다.

실제로윈도우 10그리고애플 시스템또한 다음과 같은 것을 사용하십시오.페이지 파일 압축기본 기술

게다가zswap나는 그것을 사용한 적이 없지만. 시도해 보고 어느 것이 귀하의 사용 사례에 더 적합한지 비교할 가치가 있을 수 있습니다.

그 이후의 또 다른 제안은IO 집약적인 프로세스의 우선순위를 낮춥니다.그리고 시스템 부하가 높은 경우에도 즉시 명령을 실행할 수 있도록 터미널을 더 높은 우선 순위로 실행하도록 할 수도 있습니다.

추가 읽기

답변3

하루 동안 활동이 없으면 커널은 전체 GUI가 더 이상 필요하지 않다고 결정하고 이를 RAM에서 삭제합니다(디스크로 교체).

커널이 하고 있는 일옳은 일™믿으세요. 왜 RAM에 1을 사용하지 않고 유지하여 캐시 등으로 사용하는 대신 실제로 낭비합니까?

나는 Linux 커널이 이유나 기대 없이 페이지를 교환한다고 생각하지 않습니다. 따라서 만약 그렇다면 장기 실행 작업의 성능을 향상시키기 위해 RAM에 다른 것을 저장해야 하거나 적어도 그것이 목표입니다.

랩톱을 다시 사용해야 하는 시기를 미리 알고 있는 경우 at( 또는 ) 명령을 사용하여 crontab스왑 정리를 예약 할 수 있습니다 swapoff -a;swapon -a.

스왑 영역을 정리하는 것은 약간의 작업이 될 수 있고 심지어 OOM 킬러를 유발할 수도 있으므로(어떤 이유로 모든 것이 RAM에 맞지 않는 경우) 모든 콘텐츠를 복원하려는 실행 중인 애플리케이션과 관련된 2를 "스왑 해제"하면 됩니다.

gdb한 가지 접근 방식은 영향을 받는 각 프로세스에 디버거를 연결 하고 코어 덤프 생성을 트리거하는 것입니다.

# gdb -p <pid>
...
generate-core-dump /dev/null
...
quit

작성하는 동안 장기 실행 애플리케이션은 초기 통과 후 읽은 데이터를 재사용하지 않으므로 장기 캐싱이 쓸모가 없는 특정 상황에 처하게 됩니다. 그런 다음 Will Crawford의 제안에 따라 직접 I/O를 사용하여 캐시를 우회하는 것이 좋은 솔루션이 될 것입니다.

또는 운영 체제가 GUI 애플리케이션 및 환경이 변경되었다고 생각하기 전에 에코 1또는 더미 파일을 통해 주기적으로 파일 캐시를 새로 고칠 수 있습니다 .3/proc/sys/vm/drop_caches

바라보다Linux 시스템에서 버퍼와 캐시를 지우는 방법은 무엇입니까?더 알아보기.

1 사용되지 않은 의미: 상당한 기간 동안 더 이상 적극적으로 사용되지 않지만 메모리는 여전히 소유자와 연결되어 있습니다. 2스왑 영역에 저장된 RAM 페이지를 다시
놓습니다 .

답변4

이것은 제가 아직 시도해보지 않은 아이디어입니다(죄송하지만 지금은 시도해 볼 시간이 없습니다).

백그라운드 프로세스를 위해 메모리가 512MB에 불과한 작은 VM을 생성한다고 가정해 보겠습니다. 스왑을 원하는지 호출하고 호스트 시스템에서 스왑을 끄기를 원하는지 잘 모르겠습니다.

관련 정보