Tăng giới hạn kích thước FIFO


7

Nhờ các câu trả lời cho câu hỏi khác của tôi , giờ đây tôi hiểu rằng FIFO trên Linux, tức là /dev/xconsolecó giới hạn bộ đệm là 64 KB.

Làm cách nào tôi có thể tăng giới hạn này lên 128 KB?

Rõ ràng, tôi sẽ cần biên dịch lại kernel của mình. Điều đó tốt, nhưng tôi phải thay đổi giới hạn kích thước trong nguồn kernel ở đâu?

Có an toàn để thay đổi nó, hoặc nó có thể có một số tác dụng phụ trên các thành phần khác?

Tôi đang sử dụng kernel 3.18.

Câu trả lời:


14

Kể từ Linux kernel 2.6,35, bạn có thể tăng kích thước của một đường ống với F_SETPIPE_SZfnctl (). Người dùng không có đặc quyền bị giới hạn ở các giá trị từ 0 đến giá trị hiện tại của fs.pipe-max-size sysctl(1 MiB theo mặc định).

Giá trị bạn sử dụng phải lớn hơn 64 KiB và là lũy thừa 2.

Vì vậy, bạn có thể làm:

perl -MFcntl -e 'fcntl(STDIN, 1031, 1048576) or die $!' <> /dev/xconsole

(ở đây với F_SETPIPE_SZ được mã hóa thành giá trị của nó trên hệ thống của tôi vì phiên bản dành riêng cho Linux fcntl()không có sẵn cho phiên bản của tôi perl).

Lưu ý rằng điều fcntl()đó không ảnh hưởng /dev/xconsolenhưng bộ đệm ống đã được khởi tạo khi /dev/xconsolemở (bởi syslogvà bất kỳ ứng dụng nào đang đọc tin nhắn ở đầu kia, vì vậy bạn cần thực hiện nó ở mỗi lần khởi động sau khi syslog được khởi động).

Bây giờ, cho dù đó là những gì bạn nên làm là một vấn đề khác. ống là cơ chế truyền thông liên quá trình. Chúng không có nghĩa là để lưu trữ dữ liệu. Đối với các mục nhật ký hệ thống, 64 KiB là quá đủ vì các đơn đặt hàng có cường độ lớn hơn mục nhập nhật ký thông thường của bạn.

Nhiều khả năng trong trường hợp của bạn, bạn đã gặp vấn đề ở chỗ ứng dụng đọc từ /dev/xconsolekhông được bắt đầu đủ sớm hoặc không đọc đủ nhanh.

Trong mọi trường hợp, tôi sẽ khuyên không nên thay đổi kích thước ống mặc định toàn cầu.

Điều đó sẽ được thực hiện bằng cách thay đổi:

#define PIPE_DEF_BUFFERS        16

(thể hiện bằng số lượng 4 trang KiB) cho một cái gì đó khác trong include/linux/pipe_fs_i.h. Không phải là không thể sửa đổi những thứ khác để phản ánh sự thay đổi hoặc sự thay đổi đó sẽ ảnh hưởng đến những thứ khác theo những cách không ngờ tới.

Nếu bạn biến nó thành sức mạnh của 2 là> = 16, nó sẽ ít có khả năng phá vỡ mọi thứ, nhưng hãy cẩn thận, nó có thể ảnh hưởng đáng kể đến hiệu suất hệ thống toàn cầu và đặc biệt là hành vi lập lịch.


Có cách nào để lấy lượng dữ liệu hiện tại /dev/xconsolekhông? Tôi không có nghĩa là kích thước giới hạn bộ đệm (tức là 64KB). Tôi có nghĩa là bao nhiêu của bộ đệm đó được lấp đầy. Bằng cách đó, tôi có thể sử dụng ddđể trống /dev/xconsolengay từ đầu để loại bỏ các nhật ký khởi động sớm mà tôi không quan tâm.
Martin Vegter

3
@MartinVegter, với GNU dd, bạn có thể sử dụng dd iflag=nonblock if=/dev/xconsole of=/dev/nullđể làm trống đường ống.
Stéphane Chazelas

2
@MartinVegter, để trả lời câu hỏi của bạn về cách lấy dữ liệu hiện tại :perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &FIONREAD, $n) or die$!; print unpack "L", $n' <> /dev/xconsole
Stéphane Chazelas

làm việc tuyệt vời Cảm ơn bạn vì tất cả các câu trả lời cho câu hỏi của tôi
Martin Vegter

Mô tả tập tin xấu ở -e dòng 1
Zibri
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.