동일한 쉘을 사용하지 않는 한 nice는 Linux에서 아무런 효과가 없습니다.

동일한 쉘을 사용하지 않는 한 nice는 Linux에서 아무런 효과가 없습니다.

2개로 입력하면다른루트 터미널:

nice -n 19 burnK7 &

그리고

nice -n -19 burnK7 &

그런 다음 두 프로세스 모두 사용 가능한 CPU 시간의 약 50%를 수신합니다. 이는 예상되지도 않고 바람직하지도 않습니다.

내가 달리면같은루트 터미널:

 nice -n 19 burnK7 &
 nice -n -19 burnK7 &

예상대로 첫 번째 프로세스는 사용 가능한 CPU 시간의 약 0%를 받고 두 번째 프로세스는 약 100%를 받습니다.

이것은 버그입니까 아니면 기능입니까?

저는 단일 코어 시스템에서 커널 버전 3.16으로 Arch Linux를 실행하고 있습니다.

답변1

그래서, 사실 이후에, 여기에 몇 가지 정보가 있습니다. 보고 있는 동작은 Linux 2.6.38(2010년)에 추가된 자동 그룹 기능 때문입니다. 다음은 제가 추가할 일부 텍스트의 편집된 버전입니다.sched(7)매뉴얼 페이지당신이보고있는 것을 설명합니다.

커널은 다수의 병렬 빌드 프로세스(예: 플래그 make(1) -j)를 사용하여 Linux 커널을 빌드하는 것과 같이 다중 프로세스, CPU 집약적인 작업 부하에 직면하여 대화형 데스크탑 성능을 향상시키기 위해 자동 그룹화라는 기능을 제공합니다.

를 통해 새 세션이 생성되면 새 자동 그룹이 생성됩니다 setsid(2). 예를 들어 새 터미널 창이 시작될 때 이런 일이 발생합니다. 에서 만든 새 프로세스는 fork(2)상위의 자동 그룹 구성원 자격을 상속합니다. 따라서 세션의 모든 프로세스는 동일한 자동 그룹의 구성원입니다.

자동 그룹화가 활성화되면 자동 그룹의 모든 구성원이 동일한 커널 스케줄러 "작업 그룹"에 배치됩니다. Linux 커널 스케줄러는 작업 그룹 전체에 CPU 주기 분포를 균등화하는 알고리즘을 사용합니다. 대화형 데스크탑 성능에 대한 이점은 다음 예를 통해 설명할 수 있습니다.

동일한 CPU에 대해 경쟁하는 두 개의 자동 그룹이 있다고 가정합니다. 즉, 단일 CPU 시스템을 사용하거나 taskset(1) 모든 프로세스를 SMP 시스템의 동일한 CPU에 제한하는 데 사용한다고 가정합니다. 첫 번째 그룹에는 make -j10. 다른 하나는 단일 CPU 바인딩 프로세스인 비디오 플레이어를 포함합니다. 자동 그룹화의 효과는 두 그룹이 각각 CPU 주기의 절반을 받게 된다는 것입니다. 즉, 비디오 플레이어는 CPU 주기의 9%가 아닌 50%를 받게 되므로 비디오 재생 성능이 저하될 수 있습니다. SMP 시스템의 상황은 더 복잡하지만 일반적인 효과는 동일합니다. 즉, 스케줄러는 CPU 바인딩된 프로세스가 많이 포함된 자동 그룹이 CPU 사이클을 너무 많이 소모하지 않도록 작업 그룹 전체에 CPU 사이클을 분산합니다. 시스템의 다른 작업 중

좋은 가치와 그룹 일정

실시간이 아닌 프로세스(예: 기본 SCHED_OTHER정책에 따라 예약된 프로세스)를 예약할 때 스케줄러는 스레드가 "작업 그룹"에서 예약되는 "그룹 예약"이라는 기술을 사용합니다. 작업 그룹은 다양한 상황에서 형성되며, 여기서 관련 사례는 자동 그룹화입니다.

자동 그룹화가 활성화되면 자동 그룹(예: 에서 생성된 것과 동일한 세션 setsid(2))에 (암시적으로) 배치된 모든 스레드가 작업 그룹을 형성합니다. 따라서 각각의 새 자동 그룹은 별도의 작업 그룹입니다.

그룹 스케줄링에서는 스레드의 nice 값이 스케줄링 결정에 영향을 미칩니다.동일한 작업 그룹의 다른 스레드와 관련된 경우에만. 이는 UNIX 시스템의 nice 값에 대한 전통적인 의미 측면에서 몇 가지 놀라운 결과를 가져옵니다. 특히 자동 그룹화가 활성화된 경우(다양한 배포판의 기본값) nice(1)프로세스에 적용하면 동일한 세션(일반적으로 동일한 터미널 창)에서 실행되는 다른 프로세스와 관련된 예약에만 영향을 미칩니다.

반대로, 서로 다른 세션(예: 서로 다른 터미널 창, 각각의 작업이 서로 다른 자동 그룹에 연결되어 있음)의 유일한 CPU 바인딩 프로세스인 두 프로세스의 경우 세션 중 하나에서 프로세스의 nice 값을 수정합니다. 다른 세션의 프로세스와 관련된 스케줄러의 결정에는 아무런 영향을 미치지 않습니다.

여기에 설명된 대로 자동 그룹화가 기존 동작을 방해하는 것을 방지하려면 nice해당 기능을 비활성화할 수 있습니다.

echo 0 > /proc/sys/kernel/sched_autogroup_enabled

그러나 이는 자동 그룹 기능이 제공하려고 했던 데스크톱 상호 작용에 대한 이점을 비활성화하는 효과도 있다는 점에 유의하십시오(위 참조).

자동 그룹 좋은 값

프로세스의 자동그룹 구성원은 다음 파일을 통해 볼 수 있습니다 /proc/[pid]/autogroup.

$ cat /proc/1/autogroup
/autogroup-1 nice 0

이 파일은 자동 그룹에 할당된 CPU 대역폭을 수정하는 데에도 사용할 수 있습니다. 이는 자동 그룹의 nice 값을 설정하기 위해 파일에 "nice" 범위의 숫자를 기록함으로써 수행됩니다. 허용되는 범위는 +19(낮은 우선순위)부터 -20(높은 우선순위)까지입니다.

자동 그룹 nice 설정은 프로세스 nice 값과 동일한 의미를 갖지만 다른 자동 그룹의 상대적인 nice 값을 기반으로 CPU 주기를 자동 그룹 전체에 배포하는 데 적용됩니다. 자동 그룹 내부 프로세스의 경우 수신되는 CPU 주기는 자동 그룹의 좋은 값(다른 자동 그룹과 비교)과 프로세스의 좋은 값(동일한 자동 그룹의 다른 프로세스와 비교)의 곱입니다.

관련 정보