Linux에서 grep 및 zgrep 속도를 늦추는 방법은 무엇입니까?

Linux에서 grep 및 zgrep 속도를 늦추는 방법은 무엇입니까?

대용량 로그 파일(4GB 이상)이 많이 있는데 서버에서 다운로드할 수 없어서(다운로드 속도가 제한됨) 프로덕션 서버에서 grep 및 zgrep을 수행해야 합니다. 그러나 grep 또는 zgrep을 실행하면 많은 CPU 리소스가 소비되어 프로덕션 시스템 성능에 영향을 미칩니다.

grep 또는 zgrep 명령을 "느리게"하거나 CPU 리소스 사용을 제한할 수 있는 방법이 있습니까? 예를 들어 특정 키는 grep 명령에 0.7초 동안 스캔한 후 0.3초 동안 작업을 중지하도록 지시합니까?

내 환경은 Linux CentOS 6.9입니다.

답변1

다음과 같이 사용할 수 있습니다.EPEL 저장소( )에는 명령을 제공하는 패키지 yum install epel-release가 있습니다 .cpulimitcpulimit

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수 있습니다 .nice19

답변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은 태양광 발전을 설치합니다.

관련 정보