특정 프로그램이 교환되는 것을 방지하는 방법은 무엇입니까?


23

특정 프로그램 (예 : 리듬 박스 및 그 의존성)이 디스크로 스왑되는 것을 방지 할 수 있습니까?

Chromium이 너무 많은 메모리를 사용할 때마다 음악 플레이어가 딸꾹질을 할 때 문제가 있기 때문에 묻습니다. 이 문제를 해결하는 방법이 있습니까? 이것은 Windows에서 더 이상 문제가되지 않으므로 아마도 방법이있을 것입니다.


Tomboy 도 같은 문제가 있습니다. 일부 사람들이 GNote 로 전환 한 이유 중 하나입니다 .
Cristian Ciupitu

1
딸꾹질 문제가 반드시 교체로 인한 것은 아니라고 생각합니다. 만약 프로그램이 무언가를하고 있다면, 리눅스는 이것을 인식하고 교체하지 않아야합니다. 많은 일을하지 않는 프로그램이 가장 먼저 스왑됩니다. 실행 한 ps또는 toprhytmbox 정말 확인하여 교환되어 있는지 RSS/의 RES필드를? 귀하의 문제는 대부분 부적절한 일정으로 인해 발생한다고 생각합니다. renicerhytmbox 프로세스를 시도 하거나 일부 설정 (예 : 오디오 버퍼 크기)을 변경 해야합니다 .
Cristian Ciupitu

1
감사! 프로그램의 초기 좋은 가치를 설정하는 방법이 있습니까? / etc / nicetab 또는 뭔가? :)
Alexei Averchenko

답변:


10

딸꾹질 문제가 반드시 교체로 인한 것은 아니라고 생각합니다. 프로그램이 무언가를 재생하고 있다면, 리눅스는 이것을 인식하고 교체하지 않아야합니다. 많은 일을하지 않는 프로그램이 가장 먼저 스왑됩니다. ps 또는 top 에서 RSS/ RES필드를 보면 프로그램이 실제로 스왑되는지 확인할 수 있습니다 . 상주 세트 크기, 태스크가 사용중인 스왑되지 않은 실제 메모리 (킬로바이트).RSS

귀하의 문제는 부적절한 CPU 및 I / O 예약 및 Rhythmbox의 약간의 비 효율성 때문일 것으로 생각되며 이는 높은 시스템 부하에 민감합니다. nicerenice 명령을 사용하여 CPU 우선 순위를 변경할 수 있습니다 . ionice 명령으로 I / O 우선 순위를 변경할 수 있습니다 . 슈퍼 사용자 만 높은 우선 순위를 사용할 수 있습니다. 또한 Linux 커널 사용자는 대기 시간이 짧은 다양한 패치로 데스크탑 시스템의 응답 성을 향상 시키려고 노력하고 있으므로이를 사용하는 것이 좋습니다. 그중 하나는 Mike Galbraith작성한 ~ 200 줄짜리 패치로 Linus조차도 감동했습니다. 이 패치의 대안은 Lennart Poettering의 cgroups 트릭입니다. Fedora 15에서 기본값이 될 것입니다.

어쨌든 이러한 패치가 없으면 두 가지 옵션이 있습니다. 우선 순위가 높은 프로그램을 시작하거나 나중에 변경하십시오. 첫 번째 옵션의 경우 Rhythmbox 주위에 래퍼 스크립트를 사용할 수 있습니다.

#!/bin/sh
# Run Rhytmbox with high CPU and I/O priorities
nice -n -10 ionice -c 1 -n 1 su -l -c rhythmbox alexei

루트로 실행해야합니다. 루트로 로그인하지 않으려면 그냥이를 시작, 당신도 사용할 수 있습니다 su또는 sudo.

나중에 우선 순위를 변경하는 경우 루트로 로그인하여 변경하기가 너무 게으른 경우 5 분마다 실행되고 rhythmbox프로세스 우선 순위를 설정하는 크론 작업을 사용해 볼 수 는 있지만 권장하지는 않습니다.

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`

5

짧은 대답 : 할 수없고해서는 안됩니다.

오래 전에 실행 파일은 고정 비트 +t를 사용하여 커널이 스왑하지 않도록 지시했지만 오늘날에는 무시됩니다.

커널이 스왑을 결정하면, 정당한 이유가 있습니다. 유휴 상태 인 RAM이 낭비되는 리소스이므로 Linux는 메모리 사용에 매우 적극적입니다.

정말로 교환하고 싶지 않거나 더 많은 RAM을 얻거나 # swapoff -a권장하지 않으면 이미 문제가있는 경우 시스템을 사용할 수 없게 될 수 있습니다.

Shouldn't일부 앱을 개발할 때 전혀 바뀌지 않기를 원합니다. stackoverflow 에서이 게시물을 살펴보십시오 .


2
약 100 MiB를 예약해도 시스템이 종료 될 것이라고 생각하지 않습니다. 내 특정 문제를 해결하는 다른 방법이있을 수 있습니다 (편집 된 질문 참조)?
Alexei Averchenko

1
프로세스를 다른 프로세스보다 높은 수준의 응답 성으로 유지하려면 대답이 좋습니다 (이 작업을 수행하려면 근본이되어야합니다). 손을 더럽 히지 않으려면 메모리 페이징을 사용하는 것이 쉽지 않습니다 (코드를 만지거나 다시 컴파일하거나 LD_PRELOAD 커스텀 라이브러리를 사용하여 프로세스를 바보로 만들고 메모리 할당에 사용되는 기능을 다시 조정하는 것은 권장하지 않습니다) . 조언? 프로세스를 소중히하거나, 더 많은 RAM을 얻거나, 탭 열기를 중지하십시오;)
Torian

5
"커널이 스왑해야한다고 결정하면, 정당한 이유가 있습니다."는 사실이 아닙니다. 오늘 저는 1,3G의 여유 메모리를 가지고있었습니다. 리눅스 커널은 httpd 프로세스를 스와핑 (370M)에 넣었습니다.
bluszcz

@bluszcz (글쎄, 그 주석이 몇 살인지를 감안할 때 이것을 읽는 다른 사람들) : httpd가 제공하는 파일의 디스크 캐시가 httpd 자체에서 거의 사용되지 않는 부분보다 중요하다고 결정했기 때문일 수 있습니다. 다른 답변을 참조하십시오 "거품"을 언급합니다.
Jan Schejbal

@JanSchejbal은 리눅스가 적어도 누군가가 말하지 않고 어떤 프로세스가 중요한지 알지 못하기 때문에 그렇게합니다. 서버 환경에서는 시스템에 중요한 프로세스와 중요하지 않은 프로세스를 알려줄 수 있어야합니다. "다른 것들은 신경 쓰지 않지만,이 프로세스는이 서버의 운영에 가장 중요합니다"
Rahly


3

몇 가지 방법이 있습니다. 리눅스에 대한 "말씀"을 시도하면 스왑 (일반적으로)을 사용할 수 있습니다 .

echo 10 > /proc/sys/vm/swappiness

보낸 사람 : https://www.kernel.org/doc/Documentation/sysctl/vm.txt

교환

이 컨트롤은 커널이 메모리 페이지를 얼마나 공격적으로 스왑할지 정의하는 데 사용됩니다. 값이 클수록 공격성이 증가하고 값이 작을수록 스왑 양이 줄어 듭니다.

기본값은 60입니다.

다른 옵션은 cgroups 커널 관리자를 사용하는 것입니다. 이것은 프로세스마다 다르지만 수행해야 할 작업이 있습니다. 여기에 답변 : /unix/10214/per-process-swapiness-for -linux # 10227


1
이는 프로세스 별이 아니라 전 세계적으로 교체에 영향을 미칩니다.
Lorenzo Von Matterhorn

1
예, "(일반적으로)"에 쓴 것을 알 수 있습니다. 프로세스 별 옵션은 cgroup을 사용하여 다른 답변에 대한 링크입니다.
ceinmart

그러면 도움이되지 않습니까?
Ken Sharp

Ken Sharp :이 답변은 문제에 대한 최상의 솔루션처럼 보이는 것 (최소한 눈에)에 직접 연결되는 유일한 답변입니다. 그래서 ... 당신이 말한 것과 거의 반대입니다.
phils

@phils 당신은 이것이 작동하는 방법을 얻지 못합니다.
Ken Sharp

0

mlockall()syscall 을 사용할 수 있습니다 . mlockall ()은 메모리 프로세스를 상주하게합니다 (= 스왑 없음, 오버 커밋 없음 등). AFAIK, 쉘 명령은 없지만 쉽게 만들 수 있습니다. 다음과 같습니다.

if (mlockall(MCL_FUTURE | MCL_CURRENT))
     perror("mlockall");
execvp(argv[0], argv);

를 호출하려면 root 권한이 있어야합니다 mlockall().

그러나 다른 답변에서 말했듯이, 그것이 실제로 당신이 원하는 것이라고 생각하지 않습니다.


1
execvp가 mlockall을 취소하는 execve의 프론트 엔드이므로 코드가 전혀 작동하지 않습니다. mlock 맨 페이지의 참고 섹션을 참조하십시오.
Johannes Matokic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.