저는 대학원생이며 제가 일하는 그룹은 Linux 클러스터를 유지 관리합니다. 클러스터의 각 노드에는 자체 로컬 디스크가 있지만 이러한 로컬 디스크는 상대적으로 작고 자동 백업 기능이 없습니다. 따라서 그룹은 많은 TB의 저장 공간이있는 파일 서버를 소유합니다. 저는 상대적인 Linux 초보자이므로 속도, 네트워킹 능력 등의 측면에서 파일 서버의 사양이 무엇인지 잘 모르겠습니다. 경험상 로컬 디스크가 I / O 측면에서 파일 서버보다 훨씬 빠르다는 것을 경험으로 알고 있습니다. . 약 12 명 정도의 사람들이 파일 서버를 사용합니다.

cp를 사용하여 최대 20GB 파일을 파일 서버에서 로컬 디스크 중 하나로 복사하는 데 실시간으로 평균 약 11.5 분이 걸립니다 (time). 이 cp 작업은 (1) time 이러한 복사본에 대한 시스템 시간이 ~ 45 초 (2) 복사하는 동안 top를 살펴보면 % CPU 매우 낮습니다 (검사 결과 평균 약 0-10 % ).

cp를 사용하여 동일한 ~ 20GB 파일을 로컬 디스크의 한 폴더에서 동일한 로컬 디스크의 다른 폴더로 복사하는 데 걸리는 시간이 약 9 실시간으로 분 (time에 따라 시스템 시간으로 최대 51 초). 따라서 분명히 파일 서버는 예상대로 로컬 디스크보다 다소 느리지 만 크게 느리지는 않습니다. 로컬에서 동일한 로컬로 복사하는 것이 9 분보다 빠르지 않다는 것에 놀랐습니다.

파일 서버에서 로컬 디스크 중 하나로 최대 200 개의 대용량 파일 (각 20GB)을 복사해야합니다. 제 질문은 다음과 같습니다. Linux에서 대용량 파일을 복사 할 때 cp보다 빠른 대안이 있습니까? (또는 cp 내에 복사 속도를 높일 수있는 플래그가 있습니까?)이 복사 시간을 1 분 단축 할 수 있다고해도 대단히 도움이됩니다.

나는 새롭고 더 빠른 하드웨어 디스크를 구입한다고 확신하지만 그러한 리소스에 액세스 할 수 없습니다. 또한 시스템 관리자가 아닙니다. 저는 (초보) 사용자 일뿐입니다. -디스크에있는 부하에 대한 자세한 정보에 액세스 할 수 없습니다. 매일 약 12 명의 사람들이 파일 서버를 사용하지만이 특정 노드 / 로컬 디스크를 사용하는 유일한 사람이라는 것을 알고 있습니다.

댓글

  • 그것은 약 29MB / s를 만들며, 당신이 저에게 물어 보면 꽤 빠릅니다. 저는 ‘이 속도를 높일 수있는 명령이 ‘ 없다고 생각합니다. ” 병목 현상 “은 a) 네트워크 또는 b) 파일 서버 일 가능성이 높습니다.
  • 생각은 100 % 정확합니다. 저는 ‘이를 개선 할 수있는 것을 본 적이 없습니다. 내가 과거에 수행 한 유일한 작업은 ‘ 전송 전에 데이터를 압축하는 것이지만 이는 ‘ 시간을 추가한다는 것을 의미합니다. 압축 단계 및 압축 해제 단계를 사용하지만 데이터를 압축하기에 좋은 후보라면 ‘ 그만한 가치가 있습니다.
  • ddrsync 어느 것이 사용자 환경에서 더 빠르게 작동하는지 비교합니다.
  • @Salton 감사합니다. 아직 dd를 시도하지 않았지만 방금 rsync를 시도했습니다. time에 따르면 실시간은 약 11.5 분이고 시스템 시간은 약 1.5 분이었습니다.
  • I ‘ m 놀랍게도 아무도 여러 디스크를 마운트하여 로컬 디스크에서 로컬 디스크로 복사하는 것이 더 효율적일 수 있다고 지적하지 않았습니다. /dev/sda1에서 /dev/sdb1 (으)로 복사하는 것이 /dev/sda1의 한 위치에서 복사하는 것보다 빠릅니다. 하드 드라이브가 이겼 기 때문에 /dev/sda1의 다른 위치 또는 /dev/sda의 다른 파티션으로 ‘ 읽기와 쓰기 사이에 추가 검색을 수행해야합니다 (디스크가 회전하고 헤드가 움직이는 기존 하드 드라이브를 가정하고 SSD는 분명히 다릅니다).

답변

% CPU는 복사하는 동안 낮아야합니다 . CPU는 디스크 컨트롤러에 “X-Y 섹터의 데이터를 Z의 메모리 버퍼로 가져옵니다”라고 알려줍니다. 그런 다음 다른 작업을 수행합니다 (또는 다른 작업이 없으면 잠자기). 하드웨어는 데이터가 메모리에있을 때 인터럽트를 트리거합니다. 그런 다음 CPU는이를 몇 번 복사하고 네트워크 카드에 “메모리 위치 A, B 및 C에서 패킷을 전송합니다”라고 알려야합니다. 그런 다음 다른 작업으로 돌아갑니다.

당신은 ~ 240mbps를 밀고 있습니다.기가비트 LAN에서는 최소 800mbps를 수행 할 수 있어야하지만 :

  1. 파일 서버를 사용하는 모든 사람이 공유합니다 (및 스위치 간 연결 등)
  2. 이것은 파일 서버가 쓰기를 처리 할 수있는 속도에 의해 제한됩니다. 디스크 I / O 대역폭은 사용하는 모든 사람이 공유한다는 점을 염두에 두십시오.
  3. 방법을 지정하지 않았습니다. 파일 서버 (NFS, CIFS (Samba), AFS 등)에 액세스하고 있습니다. 네트워크 마운트를 조정해야 할 수도 있지만, 최근의 절반 정도의 기본값은 일반적으로 정상입니다.

병목 현상을 추적하려면 iostat -kx 10는 유용한 명령이 될 것입니다. 로컬 하드 디스크의 사용률을 보여줍니다. 파일 서버에서 실행할 수 있다면 파일 서버의 사용량을 알려줍니다.

일반적인 해결책은 다음과 같습니다. 당연히 예산이없는 병목 현상의 속도를 높입니다. 그러나 더 빠른 접근 방식을 찾을 수있는 몇 가지 특별한 경우가 있습니다.

  • 파일이 압축 가능한 경우 CPU가 빠르고 최소한 압축을 즉석에서 수행하는 것이 더 빠를 수 있습니다. lzop 또는 gzip --fastest.
  • 여기저기서 약간만 변경 한 다음 파일을 다시 보내는 경우 델타 만 보내는 것이 훨씬 빠릅니다. 안타깝게도 rsync는 델타를 찾기 위해 양쪽에서 파일을 읽어야하기 때문에 여기서 실제로 도움이되지 않습니다. 대신 파일을 변경할 때 델타를 추적하는 것이 필요합니다. 여기에서 대부분의 접근 방식은 앱에 따라 다릅니다. 하지만 장치 매퍼 (새로운 dm-era target 참조) 또는 btrfs와 같이 무언가를 리깅 할 수 있습니다.
  • 같은 데이터를 여러 컴퓨터에 복사하는 경우 udpcast와 같은 것을 사용하여 한 번에 모든 컴퓨터에 전송할 수 있습니다.

그리고, 당신이 “시스템 관리자가 아니라는 것을 알기 때문에 당신이 sysadmin을 가지고 있다는 것을 의미합니다. 또는 적어도 파일 서버 & 네트워크를 책임지는 누군가가 있습니다. 아마도 그에게 물어봐야합니다.” 설정의 세부 사항에 대해 훨씬 더 잘 알고 있어야합니다. 시스템 관리자는 최소한 합리적으로 예상 할 수있는 전송 속도를 알려줄 수 있어야합니다.

댓글

  • +1 for iostat -kx 10 🙂

답변

이것은 아마도 더 빠른 대안이 될 수 있으며, 이틀 동안 네트워크를 막지 않을 것입니다. 하나 또는 두 개의 큰 USB (있는 경우 USB 3) 또는 FireWire 디스크를 사용하여 서버를 열고 파일을 디스크에 복사합니다. 디스크를 로컬 컴퓨터로 가져갑니다. 파일을 컴퓨터에 복사합니다.

댓글

  • Sneakernet ( en.wikipedia.org/ wiki / Sneakernet )은 매우 빠를 수 있습니다. 테이프로 가득 찬 스테이션 왜건의 대역폭을 고속도로에서 과소 평가하지 마십시오.

답변

직접 SSH (또는 SFTP) 액세스 권한이있는 경우 (시스템 관리자에게 문의) 압축과 함께 scp를 사용할 수 있습니다 (-C) :

scp -C you@server:/path/to/yourfile . 

물론 파일을 압축 할 수있는 경우에만 유용하며 CPU 시간을 더 많이 사용합니다. 암호화를 사용하고 (SSH를 통해) 압축합니다.

댓글

  • 이 경우 비활성화하는 것이 유용합니다. 암호화. 복사본을 더 빠르게 만들려고 노력하고 있음을 기억하십시오.
  • @lgeorget 암호화 오버 헤드가 ‘ 중요하지 않은 것 같습니다. , 하드 드라이브가 얼마나 느린 지 고려하십시오. -c none에 대해 추가 할 것을 고려했지만 표준이 아닌 것 같습니다 .
  • ‘ 최대 20G 파일을 처리하므로 필요하지 않은 경우 암호화를 사용하는 것이 비효율적입니다 .
  • @lgeorget 암호화는 그가 얻는 처리량보다 훨씬 빠르게 ‘ 처리되었으므로 ‘ 어떤 속도도 느려지지 않았습니다. 그러나 여기서 SSH를 통과하는 것은 불필요 해 보입니다. 압축이 필요한 경우 다른 도구가 있습니까?
  • @Thomas SSH의 장점은 ‘ 원격 서버에 액세스 할 수 있어야한다는 것입니다. 그러면 ‘ 거의 확실하게 SSH를 실행합니다. 또 다른 옵션은 파일을 로컬로 압축하고 서버에 복사 한 다음 ssh에서 압축을 푸는 것입니다.

답변

효율성의 정의는 거꾸로입니다. 보다 효율적인 구현은 CPU 시간을 낭비합니다. 로컬 복사본에서는 평균 약 74MB / s의 처리량 (읽기 + 쓰기)을 사용하고 있으며 이는 단일 하드 디스크가 얻을 수있는 정도입니다.

댓글

  • 죄송합니다.” 효율적이고 “라고 말했을 때 저는 ” 빠른 것을 의미했습니다. ”

답변

cp 구현은 병목 현상이 아닐 가능성이 높습니다. 서버 및 클러스터 노드 모두에서 iotop를 통해 IO 사용량을 관찰하십시오. 이렇게하면 성능을 향상시킬 수있는 아이디어를 얻을 수 있습니다.

또 다른 팁은 동일한 호스트에서 동일한 데이터를 복사하지 않는 것입니다. 예를 들어 네트워크를 통해 파일 서버에서 모든 클러스터 노드로 배포 할 동일한 20G 파일이있는 경우 단일 서버 대 모든 클라이언트가 아닌 피어 투 피어 방식으로 파일을 복사하면 훨씬 더 빠르게 작동합니다. 구현하기가 조금 더 복잡하지만 직접 연결 허브와 같은 일부 명령 줄 p2p를 사용해 볼 수도 있습니다.

해당 20G 파일 내에서 일부는 일반적이고 일부는 클러스터 노드에 따라 다릅니다. 공통 및 특정 부분으로 분할 한 다음 공통 부분을 p2p 방식으로 배포합니다.

댓글

  • ‘ LAN에있는 경우 P2P 대신 멀티 캐스트를 수행 할 수 있어야합니다. 이는 더 빠르며 네트워크 부하가 적어야합니다.

답변

파일의 성격 / 내용에 따라 약간의 차이가있을 수 있습니다. 한 컴퓨터에서 다른 컴퓨터로 각각 최대 20GB 인 200 개의 파일을 복사해야한다는 것을 이해했습니다. , 그게 다야?

파일이 압축 가능하거나 유사 / 동일한 부분이있는 경우 두 가지 접근 방식이 있습니다.

수정

해당 파일을 여러 번 복사해야합니까 ?? (예 : 복사-> 해당 파일 사용-> 파일의 내용 변경 컴퓨터 A에서-> 파일을 컴퓨터 B로 다시 복사합니다.

그렇다면 rsync가 도움이 될 것입니다. “버전간에 동일한 것을 감지하려고 시도하고 변경되지 않은 것은 복사하지 않기 때문입니다.

그리고 세 번째 방법 : 위의 내용이 맞다면 (파일이 변경된 다음 모든 파일을 두 번째 컴퓨터에 다시 복사) binary diff를 시도하여 두 번째 컴퓨터에서 첫 번째 컴퓨터에서 변경된 내용을 변경합니다.

답변

여기에 다음이 표시됩니다. 암호화는 전송할 데이터의 양을 늘릴 수 있으므로 좋은 생각입니다.

두 시스템간에 복사하는 경우 병목 현상은 당연히 발생합니다. 서버 간의 연결입니다.

로컬로 복사하는 경우 프로세스가 어떻게 진행되는지 살펴보면 단일 스레드이므로 표준 Linux 유틸리티는 다음을 사용합니다.

- for all blocks in a file read a block write a block 

이 작업에는 동시성이 없습니다.

속도를 높이려면 다음과 같이 사용할 수 있습니다.

 buffer -i infile -o outfile -m size-of-shared-memory-default-1MByte 

자세한 내용은 buffer (1) 매뉴얼 페이지를 참조하십시오.

버퍼 명령은 복사 프로세스를 동시에 실행하도록 두 프로세스를 설정합니다. 하나는 읽기 용이고 다른 하나는 쓰기 용이며 공유 메모리 버퍼를 사용하여 두 프로세스간에 데이터를 통신합니다. 공유 메모리 버퍼는 기록되지 않은 데이터의 덮어 쓰기 및 이미 기록 된 데이터의 쓰기를 방지하는 고전적인 순환 버퍼입니다. 이 프로그램을 사용하여 디스크에서 테이프로 전송하는 복사 시간의 약 10 ~ 20 %를 줄였습니다.

코멘트

  • 실제로는 ” 블록 읽기 / 블록 쓰기 “의 동시성은 ” 블록 쓰기 “는 실제로 커널 ‘의 버퍼에 저장하고 커널은 백그라운드에서 실제 블록 쓰기를 처리합니다 (적어도 RAM 부족 시작). 또는 어떤 이유로 O_DSYNC / O_SYNC를 사용하는 경우.

답변

P2P 전파 알고리즘을 시도하지 않는 이유 , 전체 클러스터를 동시에 업데이트해야하는 경우

https://github.com/lg/murder 는 트위터에서 사용하는 것

BTSync 도 사용할 수 있습니다.

답변

여기 저기 약간만 변경하여 동일한 파일 세트를 로컬 컴퓨터에서 서버로 자주 복사하는 경우. rsync 또는 DVCS (예 : hg 또는 git)를 사용하여 전송 속도를 높일 수 있습니다.

git 또는 hg는 델타를 추적 및 감지하고 해당 델타 만 전송할 수 있습니다. git을 사용하는 경우 양쪽 모두 저장소의 전체 이력을 가지고 있기 때문에 델타를 파악하는 것은 매우 저렴합니다.

rsync는 롤링 체크섬 알고리즘의 한 형태를 사용하여 다른쪽에 대한 사전 지식없이 델타를 감지합니다. rsync가 델타를 계산하는 데 더 많은 작업이 필요하지만 전체를 저장할 필요는 없습니다. 파일 기록.

답변

모든 파일을 하나의 아카이브로 패키징 할 수 있습니다 (압축 할 필요 없음). 제 경험상 아카이브 하나를 복사하는 것이 많은 수의 개별 파일을 복사하는 것보다 빠릅니다.

댓글

  • 좋은 일반적인 관찰이지만 질문에서 알 수 있듯이 “~ 200 개의 대용량 파일-각각 ~ 20GB”, 나는 이것이 문제에 대한 실제 답으로 간주 될 수 있다고 믿지 않습니다. ‘ >
  • @manatwork ah .. ‘ 명확하게 읽지 않았습니다. 총 20GB에 달하는 200 개의 파일이 있다고 생각했습니다.

답변

bbcp 를 사용해보세요. 우리 환경에서 테스트 한 결과 cp에는 f 내장 총재. 거버너를 제거 할 때 서버를 위험에 빠뜨리고 중단을 일으킬 수 있으므로주의하십시오. 우리의 경우 복사를 위해 서버를 오프라인으로 전환하고 있었으므로 더 빠를수록 좋습니다. 이로 인해 전송 시간이 몇 시간 단축되었습니다.

답변

타겟 확인 복사하기 전에 파일이 존재하지 않습니다.

때로는 동일한 호스트 (네트워크 관련 없음)에서 복사하는 데 얼마나 많은 시간이 소요되는지 놀랍습니다.

다른 cp 질문에 대한 내 답변 을 참조하세요. 간단히 말해서 기존 파일을 덮어 쓰는 것이 파일을 자르거나 먼저 연결 해제하는 것보다 훨씬 느립니다. 후자는 1.2GB 파일의 경우 8 배 더 빠릅니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다