Aumentar o limite de tamanho FIFO

9

Obrigado às respostas da minha outra pergunta , Agora eu entendo que FIFO no Linux, ou seja, /dev/xconsole tem um limite de buffer de 64 KB.

Como posso aumentar esse limite para 128 KB?

Aparentemente, precisarei recompilar meu kernel. Tudo bem, mas onde eu tenho que mudar o limite de tamanho na fonte do kernel?

É seguro alterá-lo ou pode ter alguns efeitos colaterais em outros componentes?

Estou usando o kernel 3.18.

    
por Martin Vegter 14.09.2015 / 08:41

1 resposta

14

Desde o kernel Linux 2.6.35, você pode aumentar o tamanho de um pipe com o F_SETPIPE_SZ fnctl (). Usuários não privilegiados estão limitados a valores entre 0 e o valor atual de fs.pipe-max-size sysctl (1MiB por padrão).

O valor que você usa deve ser maior que 64 KiB e ser uma potência de 2.

Então você poderia fazer:

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

(aqui com F_SETPIPE_SZ codificado para o seu valor no meu sistema, pois o fcntl() específico do Linux não está disponível para a minha versão do perl ).

Observe que fcntl() não afeta /dev/xconsole , mas o buffer de tubulação que foi instanciado quando /dev/xconsole foi aberto (por syslog e qualquer aplicativo que esteja lendo as mensagens na outra extremidade, então você ' d precisa fazê-lo em cada inicialização após o início do syslog).

Agora, se isso é o que você deveria fazer é outra questão. tubos são mecanismo de comunicação entre processos. Eles não são destinados a armazenar dados. Para entradas de syslog, 64 KiB deve ser mais que suficiente, pois suas ordens de magnitude são maiores do que sua entrada de registro típica.

Provavelmente, no seu caso, você tem um problema, pois a leitura do aplicativo de /dev/xconsole não é iniciada com antecedência suficiente ou não está sendo lida rápido o suficiente.

Em qualquer caso, aconselho não alterar o tamanho do tubo padrão global.

Isso seria feito mudando:

#define PIPE_DEF_BUFFERS        16

(expresso em número de páginas 4KiB) para outra coisa em include/linux/pipe_fs_i.h . Não é impossível que outras coisas precisem ser modificadas para refletir a mudança ou que essa mudança afetaria outras coisas de formas inesperadas.

Se você fizer um poder de 2 que seja > = 16, seria menos provável que ele quebrasse as coisas, mas cuidado, isso pode afetar significativamente o desempenho global do sistema e o comportamento do agendamento em particular.

    
por 14.09.2015 / 10:48