두 개의 전용 서버에 MySQL 인스턴스가 있습니다. 하나는 생산용이고 다른 하나는 테스트베드용입니다.
두 서버 모두 거의 동일하며 유일한 차이점은 RAID 컨트롤러와 가상 볼륨입니다(HD는 동일함). 프로덕션에는 전용 하드웨어 RAID 컨트롤러와 RAID 10 볼륨이 있습니다. 반면, RAID 컨트롤러는 소프트웨어(Lenovo ThinkServer RAID 110i)인 것으로 보이며 볼륨은 RAID 5입니다.
우리는 MySQL 커밋 중에 iowait가 높았다는 것을 확인했습니다.
while true; do date; ps auxf | awk '{if($8=="D") print $0;}'; sleep 1; done
root 26661 0.0 0.0 0 0 ? D Jun09 5:41 \_ [jbd2/dm-14-8]
root 26691 0.0 0.0 0 0 ? D Jun09 0:57 \_ [jbd2/dm-10-8]
Thu Jun 18 13:49:37 CEST 2015
root 26691 0.0 0.0 0 0 ? D Jun09 0:57 \_ [jbd2/dm-10-8]
Thu Jun 18 13:49:38 CEST 2015
root 1474 0.0 0.0 0 0 ? D Jun04 0:23 \_ [jbd2/dm-5-8]
root 26691 0.0 0.0 0 0 ? D Jun09 0:57 \_ [jbd2/dm-10-8]
Thu Jun 18 13:49:39 CEST 2015
Thu Jun 18 13:49:40 CEST 2015
root 1474 0.0 0.0 0 0 ? D Jun04 0:23 \_ [jbd2/dm-5-8]
root 1478 0.0 0.0 0 0 ? D Jun04 0:03 \_ [jbd2/dm-7-8]
root 26661 0.0 0.0 0 0 ? D Jun09 5:41 \_ [jbd2/dm-14-8]
dm-10-8 및 dm-14-8은 데이터베이스 파티셔닝과 관련이 있습니다.
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 3 240904 809656 572624 7114416 0 0 59 1681 2002 5141 3 1 67 30 0
0 4 240880 809656 572632 7114604 0 0 139 2069 2090 4985 3 1 67 29 0
1 2 240880 809284 572636 7114676 0 0 27 2159 2253 4247 2 1 72 25 0
5 2 240880 809408 572656 7114820 0 0 27 2404 2254 5350 3 1 69 27 0
습격 컨트롤러가 의심됩니다. 어떻게 확실히 알 수 있나요?
답변1
내 대답은 블록 장치 드라이버 조사와 사용 사례에 맞게 최적화할 가치가 있는 두 부분으로 나뉩니다. 하지만 데이터 손실이 발생할 수 있다는 보고가 있어서 마지막 부분을 삭제했습니다. 댓글을 읽어보세요.
하드웨어 조사
동일한 애플리케이션에 대해 2개의 서로 다른 하드웨어 세트에서 성능이 매우 다르다는 점을 이해하며 그 이유를 이해하고 싶습니다. 그래서 나는 "왜"에 대한 답을 찾는 데 도움이 되는 방법을 제안하는 것부터 시작하겠습니다.
성능에 관해서는 종종 다음을 참조합니다.Linux 성능 그래프Brendan Gregg가 자신의 블로그에 기고했습니다. 낮은 수준(하드웨어에 가장 가까운)의 경우 이러한 도구가 blktrace
완벽하다는 것을 알 수 있습니다.
이 도구에 대해 잘 알지 못해서 여기저기 검색하다가 이것을 발견했습니다.blktrace에 관한 흥미로운 기사저자: 마크 브루커 기본적으로 다음을 권장합니다. 를 사용 blktrace
하여 I/O 추적을 수행합니다.BTTT이 추적에서 정보를 추출하는 도구입니다. 이는 다음과 같습니다(30초 추적의 경우).
# blktrace -w 30 -d /dev/dm-10-8 -o dm-10-8
# blkparse -d blkmerged.out dm-10-8*
# btt -i blkmerged.out | less
출력이 길 수 있지만 D2C 항목을 찾으십시오. 이는 장치 드라이버에 전달된 I/O가 해당 드라이버에 의해 완료된 것으로 보고되는 데 걸리는 시간에 대한 아이디어를 제공합니다.
샘플 출력( dnf upgrade
바쁜 노트북의 VirtualBox VM에서 실행 중):
ALL MIN AVG MAX N
--------------- ------------- ------------- ------------- -----------
...
D2C 0.000046515 0.045781696 3.940577359 11713
...
I/O당 평균 시간은 45밀리초로 실망스러우며 최악의 경우는 최대 3.94초입니다!
이 조사를 수행하기 위해 blktrace를 사용하는 더 많은 방법을 보려면 Marc Brooker의 기사를 읽어보세요. 매우 유익한 내용입니다.
답변2
jbd2 프로세스는 ext4 로깅에 사용됩니다. 논리적으로 파일 시스템은 mysql 커밋 중에 로그에 기록되어야 하며 이는 걱정할 이유가 되지 않습니다. jbd로 인한 로드는 dm-10-8 및 dm-14-8 파티션의 마운트 매개변수에 의해 영향을 받습니다. 어떤 일이 발생하고 서버가 예기치 않게 다시 시작되는 경우 데이터베이스가 손상되지 않도록 하려면 데이터베이스 파티션에 대한 매우 보수적인 로깅이 필요할 수 있습니다. 비교를 위해 테스트 환경에서 다른 로그 마운트 옵션을 선택할 수 있습니다.