ใช้ pv (1) เพื่อ จำกัด ความเร็ว rsync


3

ฉันพยายามที่จะใช้pvมากกว่า builtin rsync ของ--bwlimitการ จำกัด แบนด์วิดธ์ของการถ่ายโอน rsync เพราะ--bwlimitถูกนำมาใช้ในทางที่ในที่สุดก็สอดคล้องและเงินโอนของฉันจึงสั้น ๆ ที่วงเงินไม่จริง kicks ใน. นี้เกือบทำงาน แต่ระบบ doesn เลิกอย่างถูกต้อง

สำหรับผู้ที่ไม่คุ้นเคยpvคือยูทิลิตีไปป์ -View แต่มันมีความสามารถเล็กน้อยที่รู้จักในการ จำกัด อัตราการส่งข้อมูลผ่านไปป์


แก้ไขเพื่อเพิ่ม: ฉันเชื่อว่าฉันพบปัญหารูทแล้ว โดยปกติกระบวนการในไปป์ไลน์จะหยุดอย่างใดอย่างหนึ่งเนื่องจาก a) stdin ปิดหรือ b) ได้รับ SIGPIPE ขณะที่เขียนไปยัง stdout สิ่งเหล่านี้ไม่ได้เกิดขึ้นเนื่องจากก) rsync ไม่เคยปิดซ็อกเก็ตบน stdin (เห็นได้ชัด) และ b) ไม่เคยพยายามเขียนไปยัง stdout เพราะ rsync หยุดส่งข้อมูลบน stdin ทันทีที่ stdout ปิด

สิ่งที่ฉันต้องการก็คือการห่อคำสั่งบางอย่างที่ทำให้ pv ปิดตัวลงทันทีที่ stdout ปิดโดยไม่คำนึงว่า stdin ยังคงส่งข้อมูลอยู่หรือไม่


สาธิต:

head -c 100000 /dev/urandom > random4.bin
ls -lh random4.bin
>    -rw-r--r-- 1 buck users 98K 2014-07-07 11:01 random4.bin

export RSYNC_RSH='sh -c '\''pv -qL10k | ssh "$@" | pv -qL11k'\'' ssh'

rsync -av --progress localhost:$PWD/random4.bin random5.bin
>    receiving incremental file list
>    random4.bin
>          100000 100%   17.47kB/s    0:00:05 (xfer#1, to-check=0/1)
>    
>    sent 30 bytes  received 100109 bytes  10540.95 bytes/sec
>    total size is 100000  speedup is 1.00
>    (never exits)

ณ จุดนี้ฉันต้อง ctrl-c เพื่อให้สามารถควบคุมเครื่องของฉันได้ ปัญหาคือว่าpvที่อยู่ที่อินพุตของ ssh ไม่เคยออกแม้จะได้ปิดเอาท์พุท

การดีบักเล็กน้อย:

pstree -lap 29532
>     rsync,29532 -av --progress localhost:/nail/home/buck/tmp/random4.bin random5.bin
>      └─sh,29533 -c pv -qL10k | ssh "$@" | pv -qL11k ssh localhost rsync --server --sender -vlogDtpre.iLsf . /nail/home/buck/tmp/random4.bin
>          └─pv,29534 -qL10k


lsof -p 29532
>    COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF      NODE NAME
>    rsync   29532 buck  cwd    DIR              252,0     4096   7345851 /nail/home/buck/tmp
>    rsync   29532 buck  rtd    DIR                9,1     4096         2 /
>    rsync   29532 buck  txt    REG                9,1   405368     94575 /usr/bin/rsync
>    rsync   29532 buck  mem    REG                9,1    51712    554006 /lib/libnss_files-2.11.1.so
>    rsync   29532 buck  mem    REG                9,1    43552    553997 /lib/libnss_nis-2.11.1.so
>    rsync   29532 buck  mem    REG                9,1    97256    553992 /lib/libnsl-2.11.1.so
>    rsync   29532 buck  mem    REG                9,1    35712    553831 /lib/libnss_compat-2.11.1.so
>    rsync   29532 buck  mem    REG                9,1    18704    553802 /lib/libattr.so.1.1.0
>    rsync   29532 buck  mem    REG                9,1  1584520    554000 /lib/libc-2.11.1.so
>    rsync   29532 buck  mem    REG                9,1    44008    554064 /lib/libpopt.so.0.0.0
>    rsync   29532 buck  mem    REG                9,1    31208    553800 /lib/libacl.so.1.1.0
>    rsync   29532 buck  mem    REG                9,1   136936    554003 /lib/ld-2.11.1.so
>    rsync   29532 buck  mem    REG                9,1   256324    172607 /usr/lib/locale/en_US.utf8/LC_CTYPE
>    rsync   29532 buck  mem    REG                9,1    26048     93726 /usr/lib/gconv/gconv-modules.cache
>    rsync   29532 buck    0u   CHR             136,10      0t0        13 /dev/pts/10
>    rsync   29532 buck    1u   CHR             136,10      0t0        13 /dev/pts/10
>    rsync   29532 buck    2u   CHR             136,10      0t0        13 /dev/pts/10
>    rsync   29532 buck    3u  unix 0xffff882026de4100      0t0 349807593 socket
>    rsync   29532 buck    4u  unix 0xffff880d79016e80      0t0 349851596 socket


lsof -p 29533
>    COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF      NODE NAME
>    sh      29533 buck  cwd    DIR              252,0     4096   7345851 /nail/home/buck/tmp
>    sh      29533 buck  rtd    DIR                9,1     4096         2 /
>    sh      29533 buck  txt    REG                9,1   101608    504936 /bin/dash
>    sh      29533 buck  mem    REG                9,1  1584520    554000 /lib/libc-2.11.1.so
>    sh      29533 buck  mem    REG                9,1   136936    554003 /lib/ld-2.11.1.so
>    sh      29533 buck    0u  unix 0xffff880d79014100      0t0 349851595 socket
>    sh      29533 buck    1u  unix 0xffff880d79014e00      0t0 349851598 socket
>    sh      29533 buck    2u   CHR             136,10      0t0        13 /dev/pts/10

lsof -p 29534
>    COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF      NODE NAME
>    pv      29534 buck  cwd    DIR              252,0     4096   7345851 /nail/home/buck/tmp
>    pv      29534 buck  rtd    DIR                9,1     4096         2 /
>    pv      29534 buck  txt    REG                9,1    35336    106025 /usr/bin/pv
>    pv      29534 buck  mem    REG                9,1  1584520    554000 /lib/libc-2.11.1.so
>    pv      29534 buck  mem    REG                9,1   136936    554003 /lib/ld-2.11.1.so
>    pv      29534 buck  mem    REG                9,1   256324    172607 /usr/lib/locale/en_US.utf8/LC_CTYPE
>    pv      29534 buck  mem    REG                9,1       54    172608 /usr/lib/locale/en_US.utf8/LC_NUMERIC
>    pv      29534 buck  mem    REG                9,1     2454    172707 /usr/lib/locale/en_US.utf8/LC_TIME
>    pv      29534 buck  mem    REG                9,1  1170770    172610 /usr/lib/locale/en_US.utf8/LC_COLLATE
>    pv      29534 buck  mem    REG                9,1      286    172708 /usr/lib/locale/en_US.utf8/LC_MONETARY
>    pv      29534 buck  mem    REG                9,1       57    172710 /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
>    pv      29534 buck  mem    REG                9,1       34    172614 /usr/lib/locale/en_US.utf8/LC_PAPER
>    pv      29534 buck  mem    REG                9,1       77    172615 /usr/lib/locale/en_US.utf8/LC_NAME
>    pv      29534 buck  mem    REG                9,1      155    172711 /usr/lib/locale/en_US.utf8/LC_ADDRESS
>    pv      29534 buck  mem    REG                9,1       59    172712 /usr/lib/locale/en_US.utf8/LC_TELEPHONE
>    pv      29534 buck  mem    REG                9,1       23    172618 /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
>    pv      29534 buck  mem    REG                9,1    26048     93726 /usr/lib/gconv/gconv-modules.cache
>    pv      29534 buck  mem    REG                9,1      373    172713 /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
>    pv      29534 buck    0u  unix 0xffff880d79014100      0t0 349851595 socket
>    pv      29534 buck    1w  FIFO                0,8      0t0 349847461 pipe
>    pv      29534 buck    2u   CHR             136,10      0t0        13 /dev/pts/10

คำตอบ:


1

ดูเหมือนว่าpvกำลังรอข้อมูลจากrsyncและrsyncกำลังรอข้อมูลที่มากเกินไป (ติดอยู่ในselect()) pvและไม่ได้ปิดการป้อนข้อมูลเพื่อ ดังนั้นจึงเป็นการหยุดชะงัก เหมือนกันเกิดขึ้นเมื่อคุณแทนที่pvด้วยสิ่งอื่น (เช่นdd) ดูเหมือนว่าคำสั่งเหล่านั้นจะไม่ทำงานเหมือนที่rsyncคาดไว้

ไม่พบวิธีแก้ปัญหาสั้น ๆ ในการฆ่าทุกสิ่ง:

export RSYNC_RSH="sh -c 'pv -qL10k | ssh \"\$@\" | (pv -qL11k; kill \$\$)' ssh"

killไม่ใช่วิธีแก้ปัญหาที่ฉันมีความสุข แต่ฉันไม่พบอีก

แน่นอนว่าการใช้$$วิธีขี้เกียจออกไปควรฆ่าpvแทน แต่จะทำอย่างไรถึงจะได้รับ pid ใน oneliner? pidofเพียงแค่ให้pvpids ใด ๆ การสอบถาม pids ผู้ปกครองนั้นดูค่อนข้างแปลกสำหรับออนไลเนอร์

รอคอยที่จะมีทางออกที่แท้จริง ... ;)


ในขณะที่ไม่ได้เป็น 'ทางออก' ที่แท้จริงนี่เป็นวิธีแก้ปัญหาที่ดี ขอบคุณ!
bukzor

เหตุใดสิ่งเดียวกันจึงไม่เกิดขึ้นกับ RSYNC_RSH = 'ssh' สำหรับฉันดูเหมือนว่าทุกอย่างจะเกิดขึ้น โดยเฉพาะอย่างยิ่ง ssh จะหยุดก่อนที่ stdin จะปิดหรือไม่
bukzor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.