높은 IO로드에서 rrdgraph 생성에 실패


8

우리는 4 개의 핵심 CPU 생산 시스템을 가지고 있으며 많은 cronjob을 수행하며 일정한 proc queue와 보통 ~ 1.5의로드를 갖습니다.

야간에는 postgres로 IO 집약적 인 작업을 수행합니다. 로드 / 메모리 사용량을 보여주는 그래프를 생성합니다 (rrd-updates.sh) IO로드가 높은 상황에서 "실패"하는 경우가 있습니다. 거의 매일 밤 일어나고 있지만 모든 높은 IO 상황에서는 그렇지 않습니다.

내 "정상적인"솔루션은 postgres를 멋지게 만들고 이온화하고 그래프 생성의 자존심을 높이는 것입니다. 그러나 이것은 여전히 ​​실패합니다. 그래프 생성은 무리를 가진 반 스레드 방지입니다. 실행 시간을 기록하고 그래프 생성의 경우 IO로드가 높을 때 최대 5 분이며 최대 4 분 동안 그래프가 누락 된 것 같습니다.
기간은 postgres 활동과 정확히 일치합니다 (이것은 때때로 그렇게 자주 발생하지는 않지만 종종 발생합니다) 실시간 prio까지 이온화 (C1 N6 graph_cron 대 C2 N3 postgres) )로 문제가 해결되지 않았습니다.

데이터가 수집되지 않는다고 가정하면 추가 문제는 ionice / nice가 여전히 작동하지 않는 것입니다.
90 % IOwait와 100i의로드에서도 5 초 이상의 지연없이 (적어도 테스트시) 데이터 생성 명령을 자유롭게 사용할 수있었습니다.

슬프게도 테스트에서 정확하게 재현 할 수 없었습니다 (가상화 된 dev 시스템 만 있음)

버전 :

커널 2.6.32-5-686-bigmem
데비안 스퀴즈 rrdtool 1.4.3 하드웨어 : 하드웨어 RAID1
마운트 옵션에 LVM이있는 SAS 15K RPM HDD : ext3 with rw, errors = remount-ro
스케줄러 : CFQ
crontab :

* * * * *               root    flock -n /var/lock/rrd-updates.sh nice -n-1 ionice -c1 -n7 /opt/bin/rrd-updates.sh

rrdcache에 대한 github의 Mr Oetiker의 관련 버그가있는 것 같습니다 :
https://github.com/oetiker/rrdtool-1.x/issues/326

이것은 실제로 내 문제 (동시 쓰기) 일 수 있지만 cronjob이 실패하지 않는다고 설명하지는 않습니다. 가정에서 실제로 2 개의 동시 쓰기 flock -n가 종료 코드 1 (테스트에서 확인 된 맨 페이지 당)을 반환합니다. 출력과 함께 전자 메일을 얻지 못하기 때문에 cronjob이 실제로는 다른 시간마다 정상적으로 실행된다는 관찰 어떻게 든 잃었다.

출력 예 : 누락 된 줄이있는 CPU로드 그래프

의견을 바탕으로 업데이트 스크립트의 중요한 소스를 추가했습니다.

rrdtool update /var/rrd/cpu.rrd $(vmstat 5 2 | tail -n 1 | awk '{print "N:"$14":"$13}')
rrdtool update /var/rrd/mem.rrd $(free | grep Mem: | awk '{print "N:"$2":"$3":"$4}')
rrdtool update /var/rrd/mem_bfcach.rrd $(free | grep buffers/cache: | awk '{print "N:"$3+$4":"$3":"$4}')

무엇을 놓치거나 어디서 더 확인할 수 있습니까?

기억하십시오 : 생산적인 시스템이므로 개발, 스택 추적 또는 유사성이 없거나 설치 가능하지 않습니다.


1
MRTG가 RRDgraph로 대체되었을 때 되돌아갑니다. 이전에서 새로운 것으로의 놀라운 변화 중 하나는 RRDgraph가 실제로보기 요청이있을 때만 이미지를 생성한다는 것입니다. 기존 MRTG는 5 분마다 모든 데이터 포인트에 대해 완전히 새로운 그래프를 생성했습니다. 문제는 그래프 렌더링이 아니라 데이터 수집에 있습니다.
ericx

@ericx 귀하의 의견에 감사드립니다. 데이터 생성 소스를 추가했습니다. 여전히 문제가 IOnice / nice 대신 vmstat 명령이라고 생각하십니까? 그렇다면 왜 그렇게 생각하십니까?
Dennis Nolte

당신합니까 cron캡처 STDERR의 아무 곳은? FreeBSD의 나는 보통이 아래를 실행에 periodic every5및 나는이 /var/log/periodic.every5일반적으로 오류를 캡처하는. 또한 세 개의 스크립트를 비틀고 순서가 바뀌어 특정 스크립트가 중단되는지 확인합니다. 내 RRDTool 경험의 대부분은 cricket자체 로깅 기능이었습니다. cricket로그는 문제를 찾기위한 우수했다. 당신은 정말 매분 수집하고 있습니까? (* / 5 * * * * 대신 * * * * *) 그래프의 단위는 무엇입니까? RRD의 기본값은 5 분입니다.
ericx

이것은 처음에 생성하는 데 사용 된 명령입니다. create cpu.rrd --step 300 DS : sys : GAUGE : 70 : U : U DS : user : GAUGE : 70 : U : U RRA : AVERAGE : 0.01 : 1 : 6351 따라서 다른 버그를 발견했습니다. 감사합니다. 테스트를 위해 해당 스크립트에 대해 STDOUT 및 STDERR을 다시 작성했는데 기록되지 않았으므로 처음 시도했을 때 다시 도움이되었습니다. 나는 내일 출력을 추가 할 것입니다
Dennis Nolte

1
"실패"에 대한 이해에서 rrdtool의 표시는 5 분 폴링주기를 기반으로합니다. 다음주기가 시작되기 전에 한주기를 처리하지 않고 데이터 수집 및 그래프 생성이 동일한 처리 작업의 일부인 경우 누락 된 데이터 포인트가 표시됩니다.
mc0e

답변:


2

그래프를 업데이트 할 수없는 rrdtool이 아니라이 시점에서 데이터를 측정 할 수는 없습니다. 그건 그렇고, CPU 및 메모리 통계를 측정하는 방법은 즉각적인 결과를 제공하기 때문에 잘못되었습니다. CPU 및 메모리로드는 60 초 간격으로 크게 변경 될 수 있지만 하나의 값만 사용합니다. 간격마다 평균 데이터를 제공하는 SNMP 데이터를 고려해야합니다. 또한 전체 파이프는 snmpget 호출보다 비싸고 느리게 보입니다. 격차의 주요 원인 일 수 있습니다.


후속 조치로서, 이것이었다. 일단 자원이 부족한 프로세스를 다른 서버로 옮길 수있게되면 그래프가 제대로 생성됩니다.
Dennis Nolte
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.