systemd 서비스 파일에서는 다음과 같은 스케줄링 관련 옵션을 설정할 수 있습니다.systemd.exec
매뉴얼 페이지, 내가 틀렸다면 정정해 주세요):
좋아요 프로세스 실행에 대한 기본 양호 수준(스케줄링 우선순위)을 설정합니다. -20(가장 높은 우선순위)에서 19(가장 낮은 우선순위) 사이의 정수를 사용합니다. 바라보다우선순위 설정(2)더 알아보기.
꽤 친숙한 수준입니다. 최근 Linux 커널의 "자동 그룹화" 기능으로 인해 그 효과가 어느 정도 "전복"된 것으로 보입니다. 따라서 아래 옵션은 아마도 데스크탑 환경에서 프로세스의 성능을 유지하기 위해 정말로 설정하고 싶은 옵션일 것입니다.
CPU 스케줄링 전략 실행 프로세스에 대한 CPU 스케줄링 정책을 설정합니다. 배치, 유휴, fifo, rr 중 하나를 사용하세요. 바라보다sched_setscheduler(2)더 알아보기.
CPU 스케줄링 우선순위 실행된 프로세스의 CPU 스케줄링 우선순위를 설정합니다. 사용 가능한 우선순위 범위는 선택한 CPU 스케줄링 정책에 따라 다릅니다(위 참조). 실시간 예약 정책의 경우 1(가장 낮은 우선순위)에서 99(가장 높은 우선순위) 사이의 정수를 사용할 수 있습니다. 바라보다sched_setscheduler(2)더 알아보기.
CPUSchedulingResetOnFork 부울 매개변수를 사용합니다. true인 경우 실행 중인 프로세스가 포크될 때 상승된 CPU 스케줄링 우선순위 및 정책이 재설정되므로 하위 프로세스로 유출되지 않습니다. 바라보다sched_setscheduler(2)더 알아보기. 기본값은 거짓입니다.
마지막 옵션을 이해합니다. 처음 두 가지 설명을 통해 스케줄링 정책을 선택한 다음 해당 정책에 따라 우선순위를 선택할 수 있다는 것을 알고 있습니다. 어떤 작업을 위해 무엇을 선택해야 할지 잘 모르겠습니다. 예를 들어, 백업 작업에 대해 "유휴"를 선택하는 것이 안전합니까(중복 제거로 인해 상대적으로 CPU를 많이 사용함), 아니면 다른 작업이 더 적합합니까?
전반적으로 제가 찾고 있는 것은 각 정책, 각 우선순위 및 특정 목적에 대한 적합성에 대한 이해하기 쉬운 개요입니다. 아름다운 레벨과의 상호작용도 재미있습니다.
CPU 스케줄링 외에도 IO 스케줄링도 있습니다. ionice
(틀렸다면 정정해주세요) 에 해당하는 것 같습니다 .
IOS 스케줄링 클래스 실행되는 프로세스의 I/O 스케줄링 클래스를 설정합니다. 0에서 3 사이의 정수 또는 none, realtime, best-effort 또는 유휴 문자열 중 하나를 사용합니다. 바라보다ioprio_set(2)더 알아보기.
IOS 스케줄링 우선순위 실행된 프로세스의 I/O 스케줄링 우선순위를 설정합니다. 0(가장 높은 우선순위)에서 7(가장 낮은 우선순위) 사이의 정수를 사용합니다. 사용 가능한 우선순위는 선택한 I/O 예약 클래스에 따라 다릅니다(위 참조). 바라보다ioprio_set(2)더 알아보기.
여기서는 CPU 스케줄링과 동일한 구조를 볼 수 있습니다. 저도 같은 종류의 정보를 찾고 있어요.
모든 "스케줄링" 옵션과 마찬가지로 참조된 매뉴얼 페이지는 나에게 충분히 명확하지 않으며 대부분 내용을 다소 기술적으로 기울어진 데스크탑 사용자의 관점으로 번역하기 위한 것입니다.
답변1
CPU스케줄링{정책|우선순위}
CPUSchedulingPriority
이 링크는 또는 ("라이브") 작업에 대해서만 설정되어야 함을 알려줍니다 . 서비스의 실시간 예약을 강제하고 싶지 않습니다.fifo
rr
CPUSchedulingPolicy=other
기본값입니다.
그러면 batch
과 idle
. 이들 사이의 차이점은 동시에 CPU를 소비하는 여러 유휴 우선 순위 작업이 있는 경우에만 의미가 있습니다. 이론적으로는 batch
대기 시간이 길어지는 대신 더 높은 처리량을 제공할 수 있습니다. 그러나 이는 큰 승리가 아니므로 이 경우에는 실제로 관련이 없습니다.
idle
다른 것이 CPU를 원하면 굶어 죽을 것입니다. 단일 코어를 사용하는 이전 UNIX 시스템의 경우 CPU 우선순위는 예전만큼 중요하지 않습니다. nice
나는 그것에 의지하기 전에 좋은 레벨 10이나 14부터 시작하는 것이 더 행복할 것입니다 idle
. 다음 섹션을 참조하세요.
그러나 대부분의 데스크탑은 대부분의 시간 동안 상대적으로 유휴 상태입니다. 백그라운드 작업을 선점하는 CPU 호그가 있는 경우 해당 호그는 일반적으로 CPU 중 하나만 사용합니다. 이를 염두에 두면 idle
일반 데스크탑이나 노트북에서 사용하는 것이 그리 위험하다고 느끼지 않을 것입니다 . Atom/Celeron/ARM CPU 등급이 없는 경우약 15와트 이하;그럼 좀 더 주의깊게 살펴보고 싶습니다.
커널 "자동 그룹" 기능이 nice 수준을 "전복"합니까?
예.
자동 그룹화가 좀 이상하네요. 저자는 systemd
데스크톱에서도 경험적 방법을 좋아하지 않습니다. 자동 그룹화 비활성화를 테스트하려면 다음을 설정할 수 있습니다.시스템 제어 kernel.sched_autogroup_enabled
도착하다 0
. 나는 sysctl을 영구 구성으로 설정하고 재부팅하여 모든 자동 그룹이 제거되는지 확인하여 이를 테스트하는 것이 가장 좋을 것이라고 생각했습니다.
그러면 아무런 문제 없이 좋은 수준의 서비스를 제공할 수 있을 것입니다. 적어도 현재 버전의 systemd에서는 다음 섹션을 참조하세요.
예를 들어 nice 레벨 10은 Linux CPU 스케줄러의 각 스레드 가중치를 약 10%로 줄입니다. 좋은 수준 14는 5% 미만입니다. (관련된:전체 레시피)
부록: nice 레벨이 systemd cgroup에 의해 "전복"되었나요?
현재의DefaultCPUAccounting=
환경서비스별 CPU 제어를 활성화하지 않고 활성화할 수 없는 경우 기본값은 꺼짐입니다. 그러니 괜찮을 것입니다. 현재 문서에서 이를 확인할 수 있습니다.man systemd-system.conf
서비스별 CPU 제어는 다음과 같은 경우에도 활성화됩니다.어느서비스는 CPUAccounting/CPUWeight/StartupCPUWeight/CPUShares/StartupCPUShares를 설정합니다.
다음 블로그 발췌문은 오래되었지만 여전히 온라인 상태입니다. 이후 기본 동작이 변경되었으며 그에 따라 참조 문서도 업데이트되었습니다.
좋은 기본값으로, 커널에서 CPU 컨트롤러가 활성화되어 있으면 systemd는 시작 시 각 서비스에 대해 cgroup을 생성합니다. 추가 구성 없이도 이미 좋은 효과가 있습니다. systemd 시스템에서 모든 시스템 서비스는 포함된 프로세스 수에 관계없이 동일한 양의 CPU를 얻습니다. 또는 다르게 말하면: MySQL은 웹 서버에서 Apache와 대략 동일한 양의 CPU를 사용합니다. 비록 후자에는 1000개의 CGI 스크립트 프로세스가 포함되어 있지만 전자에는 소수의 작업자 작업만 포함되어 있더라도 마찬가지입니다. (이 동작은 끌 수 있습니다. /etc/systemd/system.conf의 DefaultControllers=를 참조하세요.)
이 기본값 외에도 CPUShares=를 사용하여 서비스에서 얻은 CPU 공유를 명시적으로 구성할 수 있습니다. 기본값은 1024입니다. 이 숫자를 늘리면 변경되지 않은 1024보다 서비스에 더 많은 CPU가 할당되고, 이 숫자를 줄이면 더 적은 CPU가 할당됩니다.
답변2
전형적인 성능 튜닝 조언은 "최적화하지 말고 벤치마킹하라"입니다.
일반적인 조언에 대해 걱정하지 말고 개선에 관심이 있고 이를 벤치마킹한 구체적인 사례부터 시작하세요.특정한성능 문제. 데이터를 통해 올바른 지침에 따라 조정할 수 있습니다. 데이터를 통해 프로세스의 우선순위가 낮거나, CPU를 많이 사용하거나, 다른 문제가 있는지 명확하게 알 수 있습니다.
최신 데스크탑은 종종 매우 빠르게 실행되며 조정할 필요가 없습니다.