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


17

요약

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

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

세부

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

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

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

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

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

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

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

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

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


1
대부분의 유닉스 도구는 rcp가 아닌 단순한 cp가 아니라 이러한 의미에서 대역폭에 최적화되어 있지 않습니다. 차단 IO를 사용하는 단일 스레드 앱입니다.
peterh-Reinstate Monica

1
100MB / s 정도는 순차 순차 워크로드에서 현대의 일반적인 7200rpm 회전 HDD에서 볼 수있는 것입니다. 메타 데이터를 업데이트하거나 파일 시스템이 조각화 된 경우와 같이 검색을 시작하면 IOPS에 바인딩되기 때문에 다운됩니다.
CVn

NAS에 rsync를 설치할 수 있습니까?
Jasen

답변:


27

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

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

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

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

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

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

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

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


2
매우 흥미로운 문제이며 설명을 게시 해 주셔서 감사합니다. rsync않습니다 읽어 하나의 복사하는 것이이 이렇게 제작 되었기 때문에 (실제로, 다른 프로세스) 다른 스레드에서 파일을 rsync같은쪽에 귀하의 경우 두 복사본이있는 경우에도 네트워크의 각 측면에서 실행 (및 파일 시스템이 숨어 네트워크가 있다는 사실). 라이터 프로세스가에서 차단하는 동안 리더 프로세스가 파이프를 매우 빠르게 채우므로 도움이되지 않는 것 같습니다 close(). CIFS가 아닌 유선에서 rsync사용 rsync하는 경우 성능이 향상됩니다 .
Celada

1
rsyncNAS에서 실행할 수없는 또 다른 솔루션은 rsync네트워크를 통해 rsync -a files localhost:/dest/path(예 :)와 같은 방식으로 거대한 버퍼 (예 : 여러 메가 바이트)를 인위적으로 네트워크 연결에 도입하는 것입니다. 그렇게하기위한 최고의 해킹이 어떤 것인지 잘 모르겠습니다.
Celada

@ 셀라 다 : 감사합니다! 예 rsync, NAS 상자 자체에서 실행 하면이 문제를 해결할 수 있다고 생각 합니다. 조금 더 복잡하지만 (이상한 NAS 권한, 심볼릭 링크 삭제 등) 복사 할 데이터가 조금 더 있다면 시간을 투자 할 가치가 있다고 생각합니다.
Malvineous

2
아마도 귀하의 경우와 관련이 없을 수도 있습니다 : 몇 년 전에 dump(8)NFS를 통해 마운트 된 NAS에 출력을 쓰는 비슷한 문제가있었습니다 . 당시 NFS 서버와 NAS에서 실행되는 방화벽의 결합 효과로 인해 NAS에서 CPU를 최대로 사용하는 것으로 문제를 진단했을 때 (상자가 루팅되지 않았으며 방화벽을 웹 인터페이스). NAS를 오래된 PC로 교체했을 때 문제가 사라졌습니다. FWIW.
Satō Katsura

@SatoKatsura : 구형 NAS 장치에 대한 가능성은 확실하지만이 경우 버스트가 아닌 전체 전송 속도가 느려질 것입니다. 내 NAS는 듀얼 코어 Atom (~ 2GHz)으로 점보 프레임없이 1 기가비트 NIC를 최대로 사용할 때 CPU 사용률이 약 30 %입니다.
Malvineous
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.