우리는 매우 이상한 문제에 직면했습니다. 지금까지 이루어진 모든 거래에 대한 로컬 데이터베이스를 보유한 프로그램(정확히 말하면 암호화폐 노드)이 있습니다. 데이터베이스는 약 15TB로 큽니다. 문제는 충분한 피어가 있고 이전 블록과 새 블록에 대한 지식이 문제가 되지 않음에도 불구하고 프로그램이 네트워크와 동기화되지 않는다는 것입니다.
이제 이상한 부분은 15TB의 기록 없이 동일한 프로그램을 처음부터 시작했는데 iostat
CPU와 메모리 사용률이 미미할 때마다 즉시 동기화가 시작되었다는 것입니다. 절대 수치는 다음과 같습니다:
- 읽기 속도: 5MB/s
- 쓰기 속도: 20MB/s
- iotop - 이 프로세스는 평균 20%입니다.
기록 데이터베이스(15TB)로 전환하면 iostat
디스크 사용률이 100%로 표시되고 iotop
여러 분기 프로세스가 표시되며 대부분 I/O의 99%를 차지하고 있지만 iotop
보고된 볼륨으로 판단하면 실제 I/O 그런 일은 일어나지 않았습니다 iostat
. 읽기, 쓰기 속도는 1MB/s 이내입니다. 이는 MS Azure VM에서 실행되고 있으며 Azure Portal을 통해 "전체" 모드에서 약 1%의 디스크 사용률과 "신선" 모드에서 최대 20%의 쓰기를 볼 수 있으므로 클라우드 운영자의 제한 사항은 의문의 여지가 없습니다.
이제 문제는 프로그램이 디스크에 대해 정확히 무엇을 하고 있는지 어떻게 진단할 수 있는가 하는 것입니다. 나는 무작위 I/O를 보고 strace lseek
실행해 보았고 신선 모드와 전체 모드 모두에서 일부를 얻었고 전체 모드에서는 훨씬 적었지만 그 반대를 예상했습니다. 그렇다면 전체 모드에서는 무엇을 합니까? 이 프로그램에는 /prod/<pid>/fd
50개 미만의 P2P TCP 연결과 함께 상당히 저렴한 수의 파일 설명자( )가 있습니다 . 일반적으로 말하자면, iostat
둘 다 iotop
실제로 I/O 대역폭을 소비하지 않고 100% 활용도를 보여줍니다. 이것이 어떻게 가능합니까? 우리는 심지어 Microsoft 엔지니어에게 전화를 걸었고 그는 이것이 iostat
특히 SSD의 경우 정확하지 않을 수 있다고 말했습니다. 그럴 수도 있지만 util이 100%라고 말하고 iotop
이를 확인하면 프로그램이 예상한 대로 수행되지 않는 것입니다. 다른 설명이 있습니까?