내 덕분에다른 문제, 이제 Linux의 FIFO를 이해합니다. 즉, /dev/xconsole
버퍼가 64KB로 제한됩니다.
이 제한을 128KB로 늘리려면 어떻게 해야 합니까?
당연히 커널을 다시 컴파일해야 합니다. 좋습니다. 그런데 커널 소스의 크기 제한을 어디에서 변경해야 합니까?
변경해도 안전합니까, 아니면 다른 구성 요소에 부작용이 있습니까?
3.18 커널을 사용하고 있습니다.
답변1
Linux 커널 2.6.35부터 fnctl()을 사용하여 파이프 크기를 늘릴 수 있습니다 F_SETPIPE_SZ
. 권한이 없는 사용자의 값은 0부터 현재 값까지의 범위로 제한됩니다 fs.pipe-max-size
sysctl
(기본값은 1MiB).
사용하는 값은 64KiB보다 크고 2의 거듭제곱이어야 합니다.
그래서 당신은 이것을 할 수 있습니다 :
perl -MFcntl -e 'fcntl(STDIN, 1031, 1048576) or die $!' <> /dev/xconsole
(여기서 F_SETPIPE_SZ는 내 시스템의 값으로 하드 코딩되어 있습니다. Linux 관련 값이 fcntl()
내 버전에서는 작동하지 않기 때문입니다 perl
.)
이는 파이프 버퍼가 열릴 때 인스턴스화되는 파이프 버퍼 fcntl()
에 영향을 주지 않는다는 점에 유의하십시오 /dev/xconsole
(메시지는 상대방의 모든 응용 프로그램에서 읽으므로 syslog가 시작될 때마다 이 작업을 수행해야 함)./dev/xconsole
syslog
이제 이것이 당신이 해야 할 일인지 아닌지는 또 다른 문제입니다. 파이프는 프로세스 간 통신 메커니즘입니다. 그 뜻은 아니었어가게데이터. syslog 항목의 경우 64KiB이면 일반적인 로그 항목보다 훨씬 크기 때문에 충분합니다.
귀하의 경우, 귀하가 겪고 있는 문제는 애플리케이션이 /dev/xconsole
충분히 일찍 읽히지 않거나 충분히 빨리 읽히지 않는 것일 가능성이 높습니다.
그럼에도 불구하고 전역 기본 파이프 크기를 변경하지 않는 것이 좋습니다.
이는 다음을 변경하여 수행할 수 있습니다.
#define PIPE_DEF_BUFFERS 16
(4KiB 페이지로 표현) 다른 콘텐츠로include/linux/pipe_fs_i.h
. 변경 사항을 반영하기 위해 다른 사항을 수정해야 하거나 변경 사항이 예상치 못한 방식으로 다른 사항에 영향을 미치는 것은 불가능하지 않습니다.
2의 거듭제곱(>= 16)으로 만들면 문제가 발생할 가능성이 적지만 전역 시스템 성능, 특히 예약 동작에 큰 영향을 미칠 수 있다는 점에 유의하세요.