배터리로 시스템을 실행하기 때문에 누적된 CPU 시간 사용량이 매우 걱정됩니다.
오랫동안 실행되는 프로세스는 자주 실행되고 종료되는 프로세스에 비해 top에 많은 CPU 시간을 축적하므로 top의 TIME+ 열은 나에게 그다지 도움이 되지 않습니다.
오랜 시간 동안 명령의 모든 프로세스에 대한 CPU 시간을 기록하고 이를 모두 합산하여 지속적으로 표시하고 싶습니다. 나는 내 시스템에서 실제로 실행하는 모든 명령에 대해 이 작업을 수행합니다. 예를 들어:
bash 5:00:00
dbus-daemon 4:30:00
firefox 3:00:00
NetworkManager 1:20:00
으로 정리되어 있어요주문하다한 줄에 - 하나가 아님프로세스각 라인. 오른쪽 열은 명령의 모든 프로세스에 대한 CPU 시간을 합산하여 생성됩니다.
단일 프로세스의 CPU 시간만 계산하면 bash는 내가 설정한 것만큼 높지 않지만 모든 프로세스를 합치면 그만큼 높을 수 있습니다. Bash는 여러 번 실행되었으며 매번 #!/bin/bash
shebang이 포함된 쉘 스크립트가 있었습니다.
답변1
이에 대한 좋은 견해는 다음을 통해 쉽게 얻을 수 있습니다.atop
-p
명령당(즉, 모든 호출에서) 누적 CPU(또는 리소스)를 표시하는 옵션이 있는 명령입니다 ssh
.
이는 Normal 과 유사 top
하지만 더 높은 간격(기본적으로 10초)으로 정보를 표시하므로 문제에 잘 맞습니다. 예를 들어, 달리기는 atop -p 60
전체 분 요약을 제공하며 대부분의 경우 괜찮습니다.
답변2
powertop
내 직감은 프로세스 시간을 실제로 계산하는 것보다 이것으로부터 더 많은 것을 배울 수 있다는 것입니다 . 그러나 어쨌든:
설치 bpftrace
; 예제가 함께 제공됩니다 execsnoop.bt
(/usr/share/bpftrace/tools에 설치될 수 있음). 각 PID의 시작 시간을 저장하고 다음과 같이 종료 시 차이를 인쇄하는 또 다른 프로브를 추가하십시오 tracepoint:syscalls:sys_enter_exit*
(이것은 테스트되지 않았으며 현재 내가 가장 좋아하는 시스템에 있지 않으며 설명을 위해 노력 중입니다).
#!/usr/bin/bpftrace
tracepoint:syscalls:sys_enter_exec*
{
@start[pid] = nsecs;
printf("START;%-6d;", pid);
join(args->argv);
}
tracepoint:syscalls:sys_enter_exit*
{
$from = @start[pid];
$until = nsecs;
printf("STOP;%-5d;%-16d\n", pid, $until-$from);
}
실행 파일을 만들고 루트로 실행한 후 출력을 파일에 저장합니다.
bpftrace
(내가 아는 한) 프로그램 이름 인쇄나 인수에 줄 바꿈 등을 방지할 수 있는 좋은 기능이 없기 때문에 출력을 구문 분석하는 것은 약간 짜증스러울 수 있습니다 . 그러나 본질적으로 START;
or 줄을 먼저 구문 분석한 STOP;
다음 PID를 구문 분석합니다. 줄바꿈은 포함될 수 있고 포함될 것이기 때문에 START;
다음 줄이 실제로 or 로 시작하는 곳에서 끝납니다 .STOP;
join(argv)
이를 통해 각 실행 파일의 실행 시간을 누적할 수 있습니다.
배터리로 시스템을 실행하기 때문에 누적된 CPU 시간 사용량이 매우 걱정됩니다.
이는 생각보다 적을 수 있습니다. 800MHz의 CPU 시간은 1600MHz의 동일한 CPU 시간보다 배터리를 덜 사용합니다. 주어진 문제에 800MHz의 시간이 절반이 필요한지, 더 많은지, 아니면 더 적은지 여부는 문제에 따라 다릅니다.
더 나쁜 점은 CPU 시간을 거의 사용하지 않도록 최적화된 프로그램이 종종 수율과 같은 작업을 수행하지만 운영 체제에 의존하여 빠르게 깨운 후에만 가능하다는 점입니다. 부하가 낮을 때는 훌륭하고 CPU 코어가 그 사이에 잠을 자도록 허용하지만, 부하가 높을 때는 갑자기 불필요한 컨텍스트 스위치를 많이 처리하게 되므로 끔찍합니다.그리고CPU가 더 적은 에너지를 사용하여 동일한 클록 주파수에서 동일한 작업을 수행할 수 있도록 하는 기능은 폐기됩니다.
그리고 특히 임베디드 사용 사례에서 인터럽트를 처리하고 기타 핵심 작업을 수행하는 데 소요되는 시간은 단순히 관찰할 수 없는 전력 소비와 상대적으로 상관관계가 있습니다.
하지만 나는 당신의 예를 좋아해요많은!
단일 프로세스의 CPU 시간만 계산하면 bash는 내가 설정한 것만큼 높지 않지만 모든 프로세스를 합치면 그만큼 높을 수 있습니다. Bash는 매번 #!/bin/bash shebang이 포함된 쉘 스크립트를 사용하여 여러 번 실행되었습니다.
예, 하지만 bash도 CPU 시간을 거의 차지하지 않습니다. 약간의 구문 분석을 수행한 다음 다른 프로세스를 호출하고 완료될 때까지 기다립니다. 매우 비효율적인 쉘 스크립트를 작성하지 않는 한, 반올림 오류가 발생할 때까지 입력을 기다리거나 명령이 완료될 때까지 기다립니다. 따라서 실제 쉘 스크립트 실행에 필요한 모든 시간은 에서 소비됩니다 bash
.
⁰ 타이머 설정, poll
/ select
fd 자주 변경, 소규모 네트워크 전송 시작...
1 대부분의 하위 캐시는 핫 상태입니다. 즉, 실제로 메모리 가져오기가 발생하지 않으며 분기 예측이 대부분 정확하므로 추측 실행이 가장 가능성이 높은 경우로 축소될 수 있습니다.
² 예를 들어, bash에서 긴 루프를 사용하여 대규모 수학 문제를 해결해 보세요.
³ 예를 들어,chmod script.bt; sudo ./script.bt > lifetimes.log