[unix] 로컬 디스크 읽기와 동시에 Linux가 네트워크 파일 시스템에 쓰기

요약

네트워크를 통해 데이터가 전송되지 않는 동안 읽고 로컬 디스크가있는 동안 네트워크를 통해 해당 데이터를 전송하는 대신 Linux가 로컬 디스크 / 파일 시스템에서 읽고 네트워크 공유에 동시에 쓰도록 구성하는 방법 게으른?

한 작업 만 수행 한 다음 다른 작업을 번갈아 수행하는 대신 동시에 읽고 쓰는 것이 훨씬 빠릅니다.

세부

Linux 시스템의 로컬 디스크에서 NAS 장치로 많은 양의 데이터를 옮깁니다.

내가 사용하고 rsync기본적으로 복사 /srv/data/mnt/nasCIFS 마운트이다.

읽기와 쓰기가 동시에 일어나면서 100MB / 초로 읽고 100MB / 초 (기가비트 네트워크의 한계)로 NAS에 쓰기를 시작했습니다.

그러나 이제 몇 시간 후에 로컬 디스크에서 읽은 다음 NAS에 쓰는 동안 읽기를 중지 한 다음 NAS에 쓸 데이터가 더 이상 없으면 디스크에서 다시 읽습니다. 다시. 디스크를 읽는 동안 네트워크가 유휴 상태이고 네트워크가 사용중인 동안 디스크가 유휴 상태입니다.

말할 것도없이 200MB를 읽고 200MB를 쓰는 것은 동시에 200MB를 읽고 쓰는 것보다 훨씬 오래 걸립니다.

읽기와 쓰기 사이를 번갈아 가면서 한 번에 하나의 작업 만 수행하지 않고 동시에 읽기와 쓰기의 이전 동작을 고수하도록 커널을 구성하려면 어떻게해야합니까?

일부 관찰 : 로컬 디스크가 100 + MB / 초로 읽 히면 모든 것이 병렬로 잘 일어나는 것처럼 보이지만 디스크가 느려지면 (어떤 이유로 인해 현재 20MB / 초로 진행되는 것처럼 보임)이 읽기 / 쓰기 전환이 발생하는 것 같습니다.

또한 실행할 수 sync있지만 퍼팅 쓰기가 (감소 속도 분명하지만)이 읽기와 병렬로 일어나는 얻을 수있는 수동으로 몇 초마다 syncA의 while그것이 올바른 해결책은 아닌 것 같아 5 초마다 실행되도록 루프를 …

커널은 약 1GB의 데이터를 캐시 한 다음 가능한 한 빨리 네트워크를 통해 기록하는 것 같습니다. 괜찮습니다. 데이터를 전송하는 동안 느린 디스크 읽기를 중지 해야하는 이유를 이해하지 못합니다. 회로망.



답변

좀 더 조사한 후이 문제는 커널과 관련이 없으며 rsyncCIFS의 상호 작용 방식에 대한 것입니다.

내가 알 수있는 한, rsyncCIFS (및 아마도 모든 네트워크 파일 시스템)는 대상 파일을 닫을 때 closesyscall이 반환 되기 전에 파일이 완전히 플러시되고 원격 디스크에 기록되도록 합니다. 이는 닫기 작업이 성공적으로 완료되면 파일이 완전히 저장되었으며 데이터 손실을 일으킬 수있는 추가 오류의 위험이없는 응용 프로그램을 보장하기위한 것입니다.

이 작업을 수행하지 않으면 응용 프로그램이 파일을 닫고 저장 작업이 성공적으로 완료된 것으로 종료 한 다음 나중에 (네트워크 문제로 인해) 데이터를 전혀 쓸 수 없지만 사용자가 파일을 다른 곳에 저장하길 원하는지 묻는 것과 같이 응용 프로그램이 관련 작업을 수행하기에는 너무 늦습니다.

이 요구 사항은 rsync파일 복사가 완료 될 때마다 rsync다음 파일을 계속 읽기 전에 네트워크를 통해 전체 디스크 버퍼를 비워야 함을 의미 합니다.

해결 방법은 cache=none이 기능을 비활성화하고 모든 I / O가 서버로 직접 전송되도록하는 옵션으로 CIFS 공유를 마운트하는 것 입니다. 이렇게하면 문제가 해결되고 읽기와 쓰기가 병렬로 실행될 수 있지만이 솔루션의 단점은 성능이 다소 떨어진다는 것입니다. 필자의 경우 네트워크 전송 속도가 110MB / 초에서 80MB / 초로 떨어집니다.

큰 파일을 복사하는 경우 번갈아 읽기 / 쓰기 동작을 수행하면 성능이 향상 될 수 있습니다. 더 작은 파일이 많은 경우 캐시를 비활성화하면 파일을 닫을 때마다 캐시 플러시가 줄어들어 성능이 향상 될 수 있습니다.

보인다 rsync마지막 하나는 아직 플러시되는 동안 그 다음 파일을 읽기 시작할 수 있도록, 다른 스레드에서 해당 파일 핸들을 닫 옵션이 필요합니다.

편집 : 내가 있음을 확인했다 cache=none확실히 작은 파일을 많이 전송할 때 도움 (80메가바이트 / 초에 10메가바이트 / 초부터 그것을 제공)하지만 큰 파일을 전송할 때 (1GB +)이 cache=none같은 80메가바이트 / 초 아래로 110메가바이트 / 초에서 전송 삭제합니다. 이것은 많은 작은 파일로부터의 느린 전송이 소스 디스크 탐색에 관한 것이 아니라 모든 작은 파일에서 많은 캐시 플러시를 갖는 것에 관한 것임을 시사합니다.


답변