Robô rodando Linux demora para inicializar

Robô rodando Linux demora para inicializar

Estou trabalhando com uma plataforma robótica (para uso na competição RoboCup) e rodamos o Ubuntu Server 13.10. É fundamental durante as partidas que nossos robôs consigam inicializar o mais rápido possível. Além do mais, se eles desligarem e ligarem durante uma queda, o robô terá 10 segundos para voltar à vida antes de ser retirado do campo.

Atualmente o tempo de boot está em torno de 15 segundos e gostaria de saber o que posso fazer para reduzir esse tempo. Espero que eu possa aprender alguma coisa também.

Aqui está a saída completa dedmesgo que suponho que ajuda a detalhar o que está acontecendo em cada intervalo de tempo. Existem algumas lacunas na produção:

  • Em 0,41 há um intervalo de cerca de 0,8 segundos
  • Em 3,64 há um intervalo de cerca de 2,8 segundos
  • Às 9,67 há um intervalo de cerca de 0,8 segundos
  • Em 12,9 há um intervalo de cerca de 1,4 segundos

ethnão é necessário, embora wlanseja.

Alguém pode decodificar isso em conselhos práticos sobre como inicializar esse bot mais rapidamente? E se não houver informações suficientes nessas mensagens, o que mais posso tentar investigar mais a fundo?


EDITARModifiquei meu binário (que inicia automaticamente como um trabalho inicial) para gravar no syslog. Mostra, começando com a primeira mensagem registrada após ligado:

Oct 30 12:51:52 darwin6 kernel: imklog 5.8.11, log source = /proc/kmsg started.
....
Oct 30 12:52:12 darwin6 kernel: [   34.276716] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
Oct 30 12:52:13 darwin6 dhclient: Internet Systems Consortium DHCP Client 4.2.4
Oct 30 12:52:13 darwin6 dhclient: Copyright 2004-2012 Internet Systems Consortium.
Oct 30 12:52:13 darwin6 dhclient: All rights reserved.
Oct 30 12:52:13 darwin6 dhclient: For info, please visit https://www.isc.org/software/dhcp/
Oct 30 12:52:13 darwin6 dhclient: 
Oct 30 12:52:13 darwin6 dhclient: Listening on LPF/wlan0/00:0d:f0:95:0d:4d
Oct 30 12:52:13 darwin6 dhclient: Sending on   LPF/wlan0/00:0d:f0:95:0d:4d
Oct 30 12:52:13 darwin6 dhclient: Sending on   Socket/fallback
Oct 30 12:52:13 darwin6 dhclient: DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 3 (xid=0x3cd422f3)
Oct 30 12:52:13 darwin6 dhclient: DHCPREQUEST of 192.168.0.3 on wlan0 to 255.255.255.255 port 67 (xid=0x3cd422f3)
Oct 30 12:52:13 darwin6 dhclient: DHCPOFFER of 192.168.0.3 from 192.168.0.1
Oct 30 12:52:13 darwin6 avahi-daemon[833]: Joining mDNS multicast group on interface wlan0.IPv6 with address fe80::20d:f0ff:fe95:d4d.
Oct 30 12:52:13 darwin6 avahi-daemon[833]: New relevant interface wlan0.IPv6 for mDNS.
Oct 30 12:52:13 darwin6 avahi-daemon[833]: Registering new address record for fe80::20d:f0ff:fe95:d4d on wlan0.*.
Oct 30 12:52:14 darwin6 dhclient: DHCPACK of 192.168.0.3 from 192.168.0.1
Oct 30 12:52:14 darwin6 avahi-daemon[833]: Joining mDNS multicast group on interface wlan0.IPv4 with address 192.168.0.3.
Oct 30 12:52:14 darwin6 avahi-daemon[833]: New relevant interface wlan0.IPv4 for mDNS.
Oct 30 12:52:14 darwin6 avahi-daemon[833]: Registering new address record for 192.168.0.3 on wlan0.IPv4.
Oct 30 12:52:14 darwin6 dhclient: bound to 192.168.0.3 -- renewal in 41314 seconds.
Oct 30 12:52:21 darwin6 ntpdate[1294]: adjust time server 91.189.94.4 offset -0.243167 sec
Oct 30 12:52:46 darwin6 kernel: [   68.451644] perf samples too long (2504 > 2500), lowering kernel.perf_event_max_sample_rate to 50000
Oct 30 12:53:49 darwin6 boldhumanoid[1455]: Starting boldhumanoid process

O estranho é que também cronometrei com cronômetro. Desde ligar a energia até o início do meu processo (o robô ganhando vida) foram 35 segundos. Parece que algo está fazendo com que a gravação do syslog seja atrasada em mais 100 segundos, de acordo com os carimbos de data/hora.

Responder1

Não tenho certeza se uma instalação de servidor do Ubuntu é realmente o caminho certo a seguir, porque o que você está descrevendo parece um trabalho para o archlinux ou algo semelhante para mim.

Você precisará fazer muitas personalizações em seu sistema, e é quando uma abordagem "pegue um sistema básico e adicione tudo o que for necessário" é mais fácil do que "use uma instalação completa e remova tudo o que for desnecessário (por exemplo, apport, apparmor, dhcp ...)" um.

Mas de qualquer forma, EXISTE uma entrada no wiki sobre como reduzir o tempo de inicialização. Os comandos podem não traduzir 1to1 para o seu sistema Ubuntu, mas esta entrada pode apontar a direção certa:

https://wiki.archlinux.org/index.php/Improve_boot_performance

Sinto muito, mas reduzir o tempo de inicialização específico do dispositivo não é nada que uma resposta curta no askubuntu possa resolver, você terá que examinar cada item da sua rotina de inicialização e decidir se é necessário ou não e desabilitar os componentes do sistema de acordo.

Responder2

Este é um daqueles aplicativos em que você basicamente começa a subtrair até quebrar alguma coisa e depois recua. Por exemplo, não acho que seu robô esteja usando zeroconf, que é o daemon avahi, então desinstale-o. Você realmente precisa de rede? Ou melhor, inicialize no modo de usuário único (anexe 1 ao cmdline do kernel) e veja quantos serviços você precisa ativar antes que seu aplicativo comece a funcionar.

Responder3

Em que divisão de tamanho você está? Sei que essa pode não ser a resposta que você está procurando aqui, mas para algo crítico em termos de tempo, como levantar-se em 10 segundos, eu escolheria uma plataforma incorporada.

Se você tiver orçamento de espaço/energia, considere colocar algo como um arduino no robô e programar alguns comportamentos stand-up de circuito aberto. Você ainda pode usar o Ubuntu na placa principal. Eu sugeriria algo assim:

  • Tenha um arduino (ou similar) que receba um sinal de pulsação regular do servidor Ubuntu
  • Se passarem mais de X intervalos de pulsação, o arduiono assume o controle e reinicia o servidor
  • O arduino pode acionar diretamente os motores (ou através de qualquer controlador de motor que você esteja usando) e emite um comando stand-up, que permite ao robô "se recuperar" e não ser desqualificado, enquanto seu sistema principal inicializa.
    • Pré-programe alguns comportamentos de pé, possivelmente com base na direção para a qual o robô está voltado, e então selecione um deles com base em um acelerômetro
    • Se você não estiver em uma das divisões com pernas, basta escrever algum código cafona no ardiuno para fazer parecer que o robô está fazendo alguma coisa enquanto o servidor inicializa
  • Assim que o sistema for inicializado, ele enviará outra pulsação e o Arduino poderá liberar o controle

Existem respostas aqui que podem ajudá-lo a melhorar o tempo de inicialização (desligar as coisas até quebrá-las, basicamente), mas mesmo assim, se a perda de energia for um problema bastante comum, algo como isto pode ser muito útil.

Responder4

Tente reduzir o buffer de armazenamento para 4 MB. Em /etc/sysctl.conf escreva:

vm.dirty_bytes = 4194304 vm.dirty_background_bytes = 1048576

talvez também reduza o tempo de escrita para 3 segundos

vm.dirty_expire centisecs = 300 vm.dirty_writeback_centisecs = 300

Por favor, comente se isso ajudou ou não. Obrigado.

informação relacionada