kworker가 99% I/O 정지 시스템에서 파일 쓰기를 플러시합니다.

kworker가 99% I/O 정지 시스템에서 파일 쓰기를 플러시합니다.

우리는 여러 대의 90TB 서버를 보유하고 있습니다(Areca RAID-6은 10개의 ext4 파티션으로 분할됨).

애플리케이션은 특정 하드웨어 장치를 읽고 특정 시점에 디스크에 데이터를 씁니다.끊임없는8~10MB/초(앱은 메모리 버퍼를 사용하여 별도의 리더 및 쓰기 스레드를 실행합니다.)

가끔 파일 작업이 크롤링 속도로 느려집니다. 예를 들어 fwrite()200바이트의 데이터를 쓰는 데 10~30초가 걸리고, ftell()파일 위치를 가져오는 데 비슷한 시간이 걸리는 등의 현상이 발생합니다.

때때로(항상 그런 것은 아님) 시스템 속도가 느려지면 topCPU가 0%인 모든 프로세스가 표시됩니다.이 서버 오류 게시와 유사합니다..

감속은 몇 분 동안 지속되며 나중에 다시 발생합니다.

속도 저하의 "일일 빈도"가 없으므로 cron/ anacron등을 통해 실행되는 것을 제거했습니다.

그러나 감속 중에는 시스템 부하가 0.4(정상)에서 3-4로 변경됩니다. 매우 높은 I/O %를 iotop표시하는 경우가 많습니다 . 등이 매우 높게 표시되어 어딘가에 I/O 병목 현상이 발생합니다.kworker/u16:0+flush-8:112topvmstat%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이제 fileext2 볼륨으로 잘못 보고됩니다. blkid볼륨을 로 올바르게 보고합니다 ext4.

보이테크 트레브니libparted이는 오류임을 나타냅니다.로깅을 비활성화한 후 보고된 파일 시스템 유형이 일관되지 않습니다.

나를 편집하다

로깅을 비활성화해도 모든 시스템의 문제가 해결되지는 않습니다.

관련 정보