우리는 여러 대의 90TB 서버를 보유하고 있습니다(Areca RAID-6은 10개의 ext4 파티션으로 분할됨).
애플리케이션은 특정 하드웨어 장치를 읽고 특정 시점에 디스크에 데이터를 씁니다.끊임없는8~10MB/초(앱은 메모리 버퍼를 사용하여 별도의 리더 및 쓰기 스레드를 실행합니다.)
가끔 파일 작업이 크롤링 속도로 느려집니다. 예를 들어 fwrite()
200바이트의 데이터를 쓰는 데 10~30초가 걸리고, ftell()
파일 위치를 가져오는 데 비슷한 시간이 걸리는 등의 현상이 발생합니다.
때때로(항상 그런 것은 아님) 시스템 속도가 느려지면 top
CPU가 0%인 모든 프로세스가 표시됩니다.이 서버 오류 게시와 유사합니다..
감속은 몇 분 동안 지속되며 나중에 다시 발생합니다.
속도 저하의 "일일 빈도"가 없으므로 cron
/ anacron
등을 통해 실행되는 것을 제거했습니다.
그러나 감속 중에는 시스템 부하가 0.4(정상)에서 3-4로 변경됩니다. 매우 높은 I/O %를 iotop
표시하는 경우가 많습니다 . 등이 매우 높게 표시되어 어딘가에 I/O 병목 현상이 발생합니다.kworker/u16:0+flush-8:112
top
vmstat
%wa
I/O 스케줄러를 mq-deadline
.
또한 애플리케이션은 fsync
작성 중인 열린 파일이 포함된 파일 시스템에서 5초마다 실행됩니다.
조정할 수 있는 매개변수를 찾기 위해 속도 저하의 원인이 무엇인지 며칠 동안 인터넷 검색을 해봤지만 지금까지는 운이 없었습니다.
지속적인 글쓰기 시나리오를 위해 Linux를 조정하는 방법에 대한 제안이 있으십니까?
센토스 8
# uname -a
Linux 4.18.0-147.el8.x86_64 #1 SMP Wed Dec 4 21:51:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
IOTOP 출력
Total DISK READ : 161.32 K/s | Total DISK WRITE : 0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
b' 10666 rt/0 root 161.32 K/s 0.00 B/s 0.00 % 4.43 % MyWritingApp'
Total DISK READ : 239.58 K/s | Total DISK WRITE : 78.27 M/s
Actual DISK READ: 239.58 K/s | Actual DISK WRITE: 2.20 M/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
b' 431412 be/4 root 135.01 K/s 0.00 B/s 0.00 % 44.80 % [kworker/u16:8-flush-8:32]'
b' 10666 rt/0 root 104.57 K/s 78.11 M/s 0.00 % 1.88 % MyWritingApp'
b' 8853 be/3 root 0.00 B/s 9.27 K/s 0.00 % 0.01 % [jbd2/sdh1-8]'
b' 1123 ?dif mysql 0.00 B/s 149.57 K/s 0.00 % 0.00 % mysqld --basedir=/usr'
Total DISK READ : 388.68 K/s | Total DISK WRITE : 14.98 M/s
Actual DISK READ: 469.32 K/s | Actual DISK WRITE: 1899.42 K/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
b' 338764 be/4 root 388.68 K/s 0.00 B/s 0.00 % 89.25 % [kworker/u16:0+flush-8:112]'
b' 1123 ?dif mysql 0.00 B/s 955.83 K/s 0.00 % 0.00 % mysqld --basedir=/usr'
b' 2740 be/4 apache 0.00 B/s 1353.76 B/s 0.00 % 0.00 % httpd -DFOREGROUND'
b' 10664 be/4 root 0.00 B/s 1353.76 B/s 0.00 % 0.00 % php /usr/local/dvstor/bin64/DvStorStartRecording.php mode=ASI tsNum=0'
b' 10666 rt/0 root 0.00 B/s 14.04 M/s 0.00 % 0.00 % MyWritingApp'
Total DISK READ : 609.63 K/s | Total DISK WRITE : 15.87 K/s
Actual DISK READ: 609.63 K/s | Actual DISK WRITE: 31.74 K/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
b' 338764 be/4 root 601.70 K/s 0.00 B/s 0.00 % 99.43 % [kworker/u16:0+flush-8:112]'
b' 711 be/4 root 7.93 K/s 0.00 B/s 0.00 % 3.00 % systemd-journald'
b' 9246 be/3 root 0.00 B/s 7.93 K/s 0.00 % 0.00 % [jbd2/sdi1-8]'
b' 933 be/3 root 0.00 B/s 1354.15 B/s 0.00 % 0.00 % auditd'
b' 1966 be/4 root 0.00 B/s 2.64 K/s 0.00 % 0.00 % rsyslogd -n'
b' 2740 be/4 apache 0.00 B/s 1354.15 B/s 0.00 % 0.00 % httpd -DFOREGROUND'
VMSTAT 출력
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 2 194048 334164 612708 12537168 0 1 14 1114 13 217 1 2 95 1 0
0 2 194048 329368 614000 12540308 0 0 646 0 5136 6152 1 1 78 19 0
0 2 194048 324640 615288 12543276 0 0 622 96 5249 6541 1 2 79 18 0
0 2 194048 321584 616624 12546188 0 0 664 512 5660 6815 2 2 81 15 0
0 2 194048 317788 617884 12549124 0 0 626 52 6079 7983 2 3 80 15 0
15930768 K total memory
2445452 K used memory
2673404 K active memory
11678768 K inactive memory
318308 K free memory
617888 K buffer memory
12549120 K swap cache
8212476 K total swap
194048 K used swap
8018428 K free swap
입력/출력 스케줄러
# for d in {b..k}; do echo -n "sd${d} " ; cat /sys/block/sd${d}/queue/scheduler; done
sdb [mq-deadline] kyber bfq none
sdc [mq-deadline] kyber bfq none
sdd [mq-deadline] kyber bfq none
sde [mq-deadline] kyber bfq none
sdf [mq-deadline] kyber bfq none
sdg [mq-deadline] kyber bfq none
sdh [mq-deadline] kyber bfq none
sdi [mq-deadline] kyber bfq none
sdj [mq-deadline] kyber bfq none
sdk [mq-deadline] kyber bfq none
답변1
마지막으로 문제는 파일 수준 조각화와 관련이 있다고 생각합니다.
높은 조각화 비율이 보고되지 는 fsck
않았지만 다른 도구를 실행했는데(죄송합니다. 어떤 도구인지 잊어버렸을 수도 있음 filefrag
) 대용량 미디어 파일에서 조각화가 매우 높은 것으로 나타났습니다.
(파일 시스템에는 1GB 비디오 파일이 아주 많습니다.)
시스템 수준 문제에 대한 솔루션은 다음과 같습니다.
- 모든 파일을 백업하고 xfs로 다시 포맷합니다(다시 ext4일 수도 있지만 xfs를 사용해 보고 싶습니다).
fallocate()
시스템 호출을 사용하여 1GB의 공간을 사전 할당하도록 애플리케이션을 변경합니다.
답변2
커뮤니티에서 아무런 응답이 없자 다음이 문제에 대한 해결책이라고 생각합니다.
파일 시스템에서 로깅을 비활성화하면 %wa
모든 파티션에서 높은 I/O 로드가 발생하지 않는 것 같습니다. (예, 이것이 다른 위험을 초래할 수 있다는 것을 알고 있지만 머신이 I/O를 정지시키는 것은 우리 애플리케이션에서 절대 용납되지 않습니다.)
다음을 사용하여 로그를 비활성화했습니다 tune2fs
.
tune2fs -O ^has_journal <device>
노트저널을 삭제한 후에도 파일 시스템은 ext4로 유지되지만 parted
이제 file
ext2 볼륨으로 잘못 보고됩니다. blkid
볼륨을 로 올바르게 보고합니다 ext4
.
보이테크 트레브니libparted
이는 오류임을 나타냅니다.로깅을 비활성화한 후 보고된 파일 시스템 유형이 일관되지 않습니다.
나를 편집하다
로깅을 비활성화해도 모든 시스템의 문제가 해결되지는 않습니다.