'nc' usando ~ 100% da CPU ao transferir um arquivo FIFO

1

No servidor que está sempre conectado, estou usando isso em um crontab:

@reboot nc -k -l 1337 < /tmp/fifo.fifo

No cliente que nem sempre está na rede ou está ligado, estou usando este comando:

nc -d $IP_OF_SERVER 1337 > /tmp/fifo.fifo & $SOME_COMMAND

O servidor escuta sempre uma conexão na porta especificada (graças ao parâmetro -k), o cliente apenas se conecta ao servidor quando necessário.

Estou usando isso para o MPD e seu visualizador FIFO. O MPD é executado em um host remoto, mas meu cliente MPD (ncmpcpp) é executado localmente.

Esta é a parte importante da configuração do ncmpcpp no host local:

mpd_host = "$IP_OF_SERVER"
visualizer_fifo_path = "/tmp/fifo.fifo"

Esta é a parte importante da configuração do mpd no servidor remoto:

audio_output {
        […]
        path    "/tmp/fifo.fifo"
        […]
}

Executar o comando 'nc' em minha máquina local parece usar uma quantidade muito alta de recursos ... ~ 100% do desempenho da minha CPU.

Alguma ideia de qual é o problema? Ou se isso é normal e como eu iria melhorar todo esse cenário?

Infelizmente, não é possível especificar apenas um caminho de rede para visualizer_fifo_path, como:

visualizer_fifo_path = "$IP_OF_SERVER:/tmp/fifo.fifo"

E também não é possível montar o host remoto via NFS e usar o FIFO montado via NFS.

Veja alguns resultados de dtruss:

$ >> ps aux | grep 1337
user            96823  95,2  0,0  2433292    576 s003  R+   12:16PM  37:27.77 nc -d 192.168.2.42 1337
user            96821   0,0  0,0  2447044   1084 s003  Ss+  12:16PM   0:00.00 bash -c nc -d 192.168.2.42 1337 > /tmp/volumio.fifo & ncmpcpp -c /Users/user/.ncmpcpp/config-volumio -s visualizer

$ >> sudo dtruss -p 96821
SYSCALL(args)            = return

$ >> sudo dtruss -p 96823
dtrace: 353433 dynamic variable drops with non-empty dirty list
SYSCALL(args)            = return
select(0x4, 0x7FFF5D031F90, 0x0, 0x0, 0x0)               = 1 0
select(0x4, 0x7FFF5D031F90, 0x0, 0x0, 0x0)               = 1 0
select(0x4, 0x7FFF5D031F90, 0x0, 0x0, 0x0)               = 2 0
read(0x3, "07N72756X6J63535142424644424_4L474v41454
tmux split-window -t "$session":1 -v -p 28 "nc -d $IP_OF_SERVER 1337 > /tmp/volumio.fifo & ncmpcpp -c $HOME/.ncmpcpp/config-volumio -s visualizer"
6514\a52444345464k4z47353u313s30303133364^4h464P43353q35302420141'1g161\1b1711111
@reboot nc -k -l 1337 < /tmp/fifo.fifo
", 0x400) = 1024 0 write(0x1, "07N72756X6J63535142424644424_4L474v41454
nc -d $IP_OF_SERVER 1337 > /tmp/fifo.fifo & $SOME_COMMAND
6514\a524443454 select(0x4, 0x7FFF5D031F90, 0x0, 0x0, 0x0) = 1 0 select(0x4, 0x7FFF5D031F90, 0x0, 0x0, 0x0) = 1 0 select(0x4, 0x7FFF5D031F90, 0x0, 0x0, 0x0) = 1 0 […]

PS: Talvez o problema seja que 'nc' é iniciado em 'tmux' junto com 'ncmpcpp'…

mpd_host = "$IP_OF_SERVER"
visualizer_fifo_path = "/tmp/fifo.fifo"

Como eu executaria permanentemente 'nc -d $ IP_OF_SERVER 1337' em segundo plano, talvez também iniciado por um crontab? Existe algo como o parâmetro '-k' para se conectar a um servidor?

    
por fooness 08.03.2015 / 11:48

0 respostas