주어진 CPU 코어 수로 프로세스를 제한하려고 합니다. 작업 세트 매뉴얼 페이지에 따르면이 문서, 다음이 작동해야 합니다.
[fedora@dfarrell-opendaylight-cbench-devel ~]$ taskset -pc 0 <PID>
pid 24395's current affinity list: 0-3
pid 24395's new affinity list: 0
간단히 말해서 - 작동하지 않습니다. 프로세스를 로드 상태로 두고 top
CPU 사용량이 약 350%인지 확인합니다(작업 세트가 없을 때와 동일). 최대 100%여야 합니다.
taskset -c 0 <cmd to start process>
프로세스가 생성될 때 선호도를 올바르게 설정할 수 있습니다 . cpulimit -p <PID> -l 99
또한 사용일부 작품. 두 경우 모두 프로세스를 동일한 로드에 놓으면 CPU 사용량이 100%가 됩니다.
여기서 무슨 문제가 있습니까?
답변1
업데이트: 최신 버전의 작업 세트에는 "주어진 pid에 대한 모든 작업(스레드)에서 작동"하는 -a
/ --all-tasks
옵션이 있으며 아래에 표시된 동작을 해결해야 합니다.
저는 일부 스레드를 시작하고 CPU 주기를 소비하는 Python 스크립트를 작성했습니다. 아이디어는 매우 간단하기 때문에 이에 대해 설정된 작업을 테스트하는 것입니다.
#!/usr/bin/env python
import threading
def cycle_burner():
while True:
meh = 84908230489 % 323422
for i in range(3):
thread = threading.Thread(target=cycle_burner)
print "Starting a thread"
thread.start()
Python 스크립트를 실행하는 것만으로도 CPU 사용량의 약 150%를 소비합니다.
[~/cbench]$ ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread
작업 세트를 사용하여 Python 스크립트를 시작하면 예상대로 작동합니다. 상단을 보면 Python 프로세스 사용량이 100%임을 알 수 있습니다.
[~/cbench]$ taskset -c 0 ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread
흥미롭게도 Python 스크립트를 시작한 다음 즉시 작업 세트를 사용하여 방금 시작한 프로세스의 선호도를 설정하면 프로세스가 100%로 제한됩니다. 출력에서 Linux 스케줄러가 Python 스레드를 생성하기 전에 Bash 명령 실행을 완료한다는 점에 유의하세요. 따라서 Python 프로세스가 시작되고 CPU 0에서 실행되도록 설정된 다음 올바른 선호도를 상속하는 스레드를 생성합니다.
[~/cbench]$ ./burn_cycles.py &; taskset -pc 0 `pgrep python`
[1] 8561
pid 8561's current affinity list: 0-3
pid 8561's new affinity list: 0
Starting a thread
[~/cbench]$ Starting a thread
Starting a thread
이 결과는 정확히 동일한 작업을 수행하지만 Python 프로세스의 선호도를 설정하기 전에 Python 스레드가 생성되도록 허용하는 이 접근 방식과 대조됩니다. 이는 위에서 설명한 "작업 세트가 아무것도 수행하지 않음" 결과를 복제합니다.
[~/cbench]$ ./burn_cycles.py &
[1] 8996
[~/cbench]$ Starting a thread
Starting a thread
Starting a thread
[~/cbench]$ taskset -pc 0 `pgrep python`
pid 8996's current affinity list: 0-3
pid 8996's new affinity list: 0
여기서 무슨 문제가 있습니까?
분명히 상위 프로세스의 선호도가 변경되기 전에 생성된 스레드는 상위 프로세스의 선호도를 상속하지 않습니다. 누군가 이것을 설명하는 문서에 대한 링크를 편집할 수 있다면 도움이 될 것입니다.
답변2
스레드당 한 번 taskset을 호출해야 한다고 생각합니다. 즉, ps -eL
대신 사용 pgrep
하고 파이프로 연결해야 합니다.taskset -cp 0
ps -eLo cmd,tid | grep python | perl -pe 's/.* (\d+)$/\1/' | xargs -n 1 taskset -cp 0
이는 모든 스레드 ID에 대한 작업 세트를 호출합니다.
답변3
노력하다숫자--physcpubind
대신 (또는 )을 사용하세요 -C
. 매뉴얼 페이지에는 다음과 같이 나와 있습니다.
...명령에 대해 정책이 생성되고 모든 하위 항목에 상속됩니다.
( 최신 버전에도 옵션이 taskset
있지만 이미 실행 중인 프로세스를 수정하는 대신 시작된 작업의 하위 프로세스에도 작동하는지 확실하지 않습니다 .)-a
Sets or retrieves the CPU affinity of all the tasks (threads) for a given PID.
taskset
답변4
taskset
옵션을 성공적으로 사용했습니다 -a
. 나는 top
프로그램의 CPU를 많이 소모하는 videoconverterd라는 서버를 가지고 있습니다.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8991 root 20 0 1299472 346724 47380 S 385.7 4.3 42:41.37 videoconverterd
실행 후 taskset -apc 0 8991
CPU 로드가 다음으로 떨어졌습니다.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8991 root 20 0 1221832 293344 47380 S 99.7 3.7 49:13.28 videoconverterd
저는 CentOS 7 taskset
버전 2.23.2를 실행하고 있습니다.