우선 뻔한 공부 질문을 올려서 죄송합니다. 이것이 나쁜 습관이라는 것은 알지만, 여기서도 도움을 받을 수 있기를 바랍니다. 엄청나게 조사했지만 이에 대한 답을 찾을 수 없었기 때문입니다.
그만큼대본NFS-클라이언트는 NFS-서버에 50GB의 단일 파일을 씁니다. 평균 속도 125MByte/s로 4GB를 쓴 후에는 12MByte/s로 떨어집니다.
질문: 그걸 어떻게 설명할 수 있나요?
그만큼주어진답변질문은 다음과 같습니다. 4GB 쓰기 후 서버는 COMMIT에 응답하지 않으며 클라이언트는 캐시를 비우기를 원하기 때문에 서버가 응답할 때까지 주기적으로 COMMIT를 보냅니다. 해당 기간 동안 데이터 속도는 가장 느린 요소 수준으로 떨어집니다.
COMMIT 프로세스에 대해 내가 찾을 수 있는 것은 다음과 같은 설명뿐입니다.
클라이언트는 데이터를 쓰고 데이터가 서버로 전송되면 COMMIT를 보냅니다. 서버는 안정적인 저장소에 데이터를 쓰고 verf-Cookie를 사용하여 COMMIT에 응답합니다. 쿠키가 클라이언트 쿠키와 다르지 않으면 클라이언트는 캐시를 비울 수 있습니다.
그래서 여기 있습니다내 질문: 서버가 verf-cookie를 전송하여 COMMIT-Procedure에 응답하지 않으면 클라이언트가 주기적으로 COMMIT를 전송하고 데이터 속도가 크게 떨어진다는 것이 사실입니까? 그렇다면 데이터 속도는 어느 수준까지 떨어지나요? 데이터 속도가 어느 정도 떨어지는지에 대한 답변으로는 결론을 내릴 수 없습니다.
답변1
나는 다음과 같은 일이 일어나고 있다고 생각합니다.
클라이언트가 보낸 데이터는 서버 측의 FS 캐시에 기록됩니다. COMMIT 요청이 전송되면 이 데이터는 영구 저장소(DISK)로 플러시되기 시작합니다. 서버의 디스크 성능에 따라 시간이 걸릴 수 있습니다. 디스크 성능이 300MB/s라고 가정해 보겠습니다. 4GB를 플러시하는 데 13초가 걸립니다. 이 시간이 NFS 시간 초과보다 길면 클라이언트는 첫 번째 COMMIT 요청이 손실되었다고 가정하여 또 다른 COMMIT 요청을 보낼 수 있습니다. COMMIT/WRITE 검증자는 이 작업 사이에 서버가 재부팅되지 않도록 하는 데 사용됩니다.
이러한 시나리오에서는 다음을 수행할 수 있습니다.
- 다음을 지정하여 클라이언트의 NFS 시간 초과를 늘립니다.시간=마운트 옵션. 비록 이것이고치다COMMIT를 재시도했습니다.
- 데이터 플러시를 충분히 일찍 시작하고 로그 지연을 방지하도록 서버에 지시합니다.
사용
sysctl -w vm.dirty_background_ratio=0
sysctl -w vm.dirty_ratio=0
sysctl -w vm.dirty_background_bytes=67108864
sysctl -w vm.dirty_bytes=536870912
크기는 서버 IO 성능 및 전체 네트워크에 따라 조정되어야 합니다.
커널이 서버의 디스크에 데이터를 플러시하기 시작하고 클라이언트 측의 서버로 보내는 시기를 제어합니다.
참고: 이 옵션은 전역적이며 모든 파일 시스템에 영향을 미칩니다.