대용량 로그 파일(4GB 이상)이 많이 있는데 서버에서 다운로드할 수 없어서(다운로드 속도가 제한됨) 프로덕션 서버에서 grep 및 zgrep을 수행해야 합니다. 그러나 grep 또는 zgrep을 실행하면 많은 CPU 리소스가 소비되어 프로덕션 시스템 성능에 영향을 미칩니다.
grep 또는 zgrep 명령을 "느리게"하거나 CPU 리소스 사용을 제한할 수 있는 방법이 있습니까? 예를 들어 특정 키는 grep 명령에 0.7초 동안 스캔한 후 0.3초 동안 작업을 중지하도록 지시합니까?
내 환경은 Linux CentOS 6.9입니다.
답변1
다음과 같이 사용할 수 있습니다.EPEL 저장소( )에는 명령을 제공하는 패키지 yum install epel-release
가 있습니다 .cpulimit
cpulimit
Usage: cpulimit [OPTIONS...] TARGET OPTIONS -l, --limit=N percentage of cpu allowed from 0 to 400 (required)
[...]
이는 대상 프로세스를 모니터링하고 주기적으로 SIGSTOP/SIGCONT 신호를 보내 강제로 예약되도록 하는 방식으로 작동합니다. CentOS6 버전은 현재 버전보다 더 많은 제한 사항이 있습니다(대상의 하위 항목도 모니터링할 수 있음).
따라서 바쁜 루프가 있는 경우:
$ time sh -c 'n=0; while [ $n -lt 50000 ]; do n=$(($n+1)); done'
real 0m0.623s
user 0m0.546s
sys 0m0.076s
CPU 사용량을 10%로 제한하도록 선택합니다. 예:
$ time cpulimit -l 10 sh -c 'n=0; while [ $n -lt 50000 ]; do n=$(($n+1)); done'
real 0m7.695s
user 0m0.795s
sys 0m0.179s
여기서 중요한 점은(이 비멀티스레드 CPU 바인딩 예제의 경우) 사용자 시간이 이제 실제 시간의 약 1/10이라는 것입니다.
-p <PID>
이 명령은 명령 대신 제공하여 실행 중인 프로세스와 함께 사용할 수도 있습니다.
이 명령은 CentOS7에서도 사용할 수 있습니다(CentOS8에서는 사용할 수 없음).
아마도 더 나은 접근 방식은 다음을 사용하는 것입니다.cgroup.
최신 시스템에서는 cgroup을 사용하고 커널이 모든 제한 사항을 자체적으로 처리하도록 하는 것이 좋지만 CentOS6(컨테이너 사용)을 테스트하는 쉬운 방법은 없습니다. 이에 대한 지침은 다음과 같습니다. 첫 번째 지침은 CentOS6에 대한 것입니다.
CentOS 6의 C그룹
nice, cpulimit 및 cgroup을 사용하여 프로세스 CPU 사용량을 제한하세요.
실제 문제가 CPU가 아닌 디스크 I/O 쓰레기라면, 제 생각에는cgroups v2만이 이를 올바르게 처리할 수 있습니다.(디스크 캐시 및 메모리 포함) 그러나 제가 아는 한 CentOS6 커널에서는 사용할 수 없습니다.
답변2
이 명령을 사용할 수 있습니다 nice
. ~에서위키피디아:
Nice는 Unix 및 Linux와 같은 Unix 계열 운영 체제를 위한 프로그램입니다. 이는 동일한 이름의 커널 호출에 직접 매핑됩니다. Nice는 특정 CPU 우선순위로 유틸리티나 쉘 스크립트를 호출하여 해당 프로세스에 다른 프로세스보다 더 많거나 적은 CPU 시간을 제공하는 데 사용됩니다. 우선순위 -20이 가장 높은 우선순위이고 19가 가장 낮은 우선순위입니다. 프로세스의 기본 niceness는 상위 프로세스에서 상속되며 일반적으로 0입니다.
nice는 여러 프로세스에 CPU가 제공할 수 있는 것보다 더 많은 리소스가 필요할 때 유용합니다. 이 상태에서는 우선 순위가 높은 프로세스가 우선 순위가 낮은 프로세스보다 더 많은 CPU 시간을 얻습니다. 수퍼유저(루트)만 niceness를 더 낮은 값(즉, 더 높은 우선순위)으로 설정할 수 있습니다.
예를 들어 프로세스를 실행하려는 경우 모든 리소스를 차지하지 않도록 우선 순위를 10 정도의 값으로 설정할 grep
수 있습니다 .nice
19
답변3
Mark Plotnick이 지적했듯이PV유틸리티는 매우 간단한 방법으로 도움을 줍니다. grep과 zgrep을 사용하면 정말 쉽습니다.
zcat web.log.2020-01-17.log.gz | pv -L 10m -q | grep someText
또는 grep의 경우:
cat web.log.2020-01-17.log | pv -L 10m -q | grep someText
10m(초당 10MB)의 전송 속도로 인해 서버의 CPU 소비량이 약 8%로 낮아지고 낮게 유지되었습니다.
pv의 장점은 단순성이지만, 단점은 서버에 적합한 전송 속도를 경험적으로 결정해야 한다는 것입니다. CentOS6에서PV설치 후 이용 가능Yum은 태양광 발전을 설치합니다.