Có tee làm chậm đường ống?


10

Tôi tự hỏi liệu tee làm chậm đường ống. Rốt cuộc, việc ghi dữ liệu vào đĩa chậm hơn so với đường ống.

Có phải tee chờ đợi với việc gửi dữ liệu qua đường ống tiếp theo cho đến khi nó được ghi vào đĩa không? (Nếu không, tôi đoán tee phải xếp hàng dữ liệu đã được gửi cùng, nhưng không được ghi vào đĩa, điều này nghe có vẻ không ổn với tôi.)

$ program1 input.txt | tee intermediate-file.txt | program2 ...

Không, "ống tiếp theo" là thứ đầu tiên nó viết (cũng được đề cập ở đây ).
ManRow

Câu trả lời:


12

Vâng, nó làm mọi thứ chậm lại. Và về cơ bản, nó có một hàng dữ liệu không được ghi lại, mặc dù điều đó thực sự được duy trì bởi kernel, tất cả các chương trình đều có điều đó, trừ khi chúng yêu cầu rõ ràng khác.

Ví dụ, đây là một ống tầm thường sử dụng pv, điều này rất tốt vì nó hiển thị tốc độ truyền:

$ pv -s 50g -S -pteba /dev/zero | cat > /dev/null 
  50GiB 0:00:09 [ 5.4GiB/s] [===============================================>] 100%

Bây giờ, hãy thêm một cái teevào đó, thậm chí không viết thêm một bản sao nữa mà chỉ chuyển tiếp nó theo:

$ pv -s 50g -S -pteba /dev/zero | tee | cat > /dev/null 
  50GiB 0:00:20 [2.44GiB/s] [===============================================>] 100%            

Vì vậy, điều đó khá chậm một chút, và nó thậm chí không làm gì cả! Đó là chi phí chung của tee sao chép STDIN vào STDOUT. (Thật thú vị, việc thêm một giây pvvào đó vẫn ở mức 5,19GiB / giây, vì vậy pvnhanh hơn đáng kể so với tee. pvSử dụng splice(2), teecó thể không.)

Dù sao, hãy xem điều gì xảy ra nếu tôi bảo teeghi vào một tệp trên đĩa. Nó khởi động khá nhanh (~ 800MiB / giây) nhưng khi nó tiếp tục, nó tiếp tục làm chậm tốc độ xuống cuối cùng xuống ~ 100MiB / s, về cơ bản là 100% băng thông ghi đĩa. (Khởi động nhanh là do kernel lưu vào bộ đệm ghi và tốc độ ghi chậm của đĩa là kernel từ chối để bộ đệm phát triển vô hạn.)

Có vấn đề gì không?

Trên đây là một trường hợp xấu nhất. Ở trên sử dụng một đường ống để phun dữ liệu nhanh nhất có thể. Việc sử dụng trong thế giới thực duy nhất tôi có thể nghĩ như thế này là chuyển dữ liệu YUV thô đến / từ ffmpeg.

Khi bạn gửi dữ liệu với tốc độ chậm hơn (vì bạn đang xử lý chúng, v.v.), nó sẽ có tác dụng ít quan trọng hơn nhiều.


Giải thích hay
shubham

5

Không có gì đáng ngạc nhiên ở đây, sau tất cả

> POSIX nói ,

SỰ MIÊU TẢ

Các tee tiện ích sẽ sao chép đầu vào tiêu chuẩn để đầu ra tiêu chuẩn, làm cho một bản sao trong zero hoặc nhiều file. Các tiện ích tee không được đầu ra đệm.

cũng đó

CƠ SỞ LÝ LUẬN

Yêu cầu về bộ đệm có nghĩa là tee không được phép sử dụng bộ đệm được ghi đầy đủ theo tiêu chuẩn ISO C hoặc bộ đệm dòng. Điều đó không có nghĩa là tee phải đọc 1 byte theo sau là ghi 1 byte.

Vì vậy, nếu không giải thích "lý do", teecó thể sẽ chỉ đọc và ghi tối đa nhiều byte có thể vừa với bộ đệm ống của bạn tại một thời điểm, xóa sạch đầu ra trên mỗi lần ghi.

Và vâng, tùy thuộc vào ứng dụng, điều này có thể không hiệu quả - vì vậy, chỉ cần xóa / nhận xét bất kỳ trong số này:
https://github.com/coreutils/coreutils/blob/master/src/tee.c#L208
https://github.com/coreutils/coreutils/blob/master/src/tee.c#L224


+1 cho các liên kết đến mã nguồn chịu trách nhiệm. Có phải những phần đó thực sự là tất cả những gì chịu trách nhiệm cho hành vi này, do đó, việc xóa / nhận xét chúng sẽ giúp teechạy nhanh hơn?
Hashim

1
Có vẻ như đó sẽ là trường hợp! Tee ghi đè lên sơ đồ đệm mà HĐH đã chọn
ManRow
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.