O robô rodando Linux é lento para inicializar

2

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

Atualmente, o tempo de inicialização é de cerca de 15 segundos e eu gostaria de saber o que posso fazer para reduzir esse tempo. Espero poder aprender algo também.

Aqui está a saída completa de dmesg , que eu suponho que ajuda a quebrar o que está acontecendo em cada etapa de tempo. Existem algumas lacunas na saída:

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

eth não é necessário, embora wlan seja.

Alguém pode decodificar isso em conselhos úteis sobre como fazer com que esse bot seja inicializado mais rápido? E se não houver informações suficientes nessas mensagens, o que mais eu poderia tentar investigar mais?

EDIT Eu modifiquei meu binário (que inicia automaticamente como um trabalho inicial) para gravar no syslog. Ela mostra, começando com a primeira mensagem registrada depois de ativada:

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 eu também fiz um cronômetro. De ligar a energia para o meu processo de partida (o robô vem vivo) foi de 35 segundos. Parece que algo está fazendo com que a gravação do syslog seja atrasada por mais 100 segundos, passando pelos timestamps.

    
por Drew Noakes 26.10.2014 / 19:54

4 respostas

4

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

Você precisará fazer muita customização em seu sistema, que é quando uma abordagem "usar um sistema básico e adicionar qualquer coisa necessária" é mais fácil do que "usar uma instalação completa e remover qualquer coisa desnecessária" (por exemplo, apport, apparmor, dhcp ...) "um.

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

link

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

    
por ApolloLV 30.10.2014 / 14:36
2

Esta é uma daquelas aplicações onde você basicamente começa a subtrair até que você quebre algo e então recue. Como, por exemplo, eu não acho que seu robô provavelmente está usando zeroconf, que é o daemon avahi, então desinstale-o. Você realmente precisa de rede? Ou melhor, inicialize no modo de usuário único (acrescente 1 ao cmdline do kernel) e veja quantos serviços você precisa ativar antes que o aplicativo comece a funcionar.

    
por ppetraki 31.10.2014 / 21:02
2

Em qual divisão de tamanho você está? Eu percebo que isso pode não ser a resposta que você está procurando aqui, mas por um tempo crítico como ficar de pé em 10 segundos, eu iria com uma plataforma embutida.

Se você tem o orçamento de espaço / energia, deve considerar adotar algo como um arduino no robô e programar alguns comportamentos de stand-up em loop 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 mais de X intervalos de pulsação passarem, o arduiono assumirá o controle e reinicializará 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 de stand-up, que permite ao robô "se recuperar" e não ser desqualificado, enquanto o sistema principal inicializa
    • Pré-programe alguns comportamentos de stand-up, possivelmente com base em qual caminho o robô está enfrentando, e selecione um deles com base em um acelerômetro
    • Se você não estiver em uma das divisões legged, então apenas escreva algum código brega no ardiuno para fazer parecer que o robô está fazendo alguma coisa enquanto o servidor inicializa
  • Quando 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 (desligue o material até que você o quebre, basicamente), mas mesmo assim, se perder energia é um problema bastante comum, algo como isto pode ser muito útil.

    
por stokastic 03.11.2014 / 05:55
1

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

vm.dirty_bytes = 4194304 vm.dirty_background_bytes = 1048576

também pode reduzir 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.

    
por iugamarian 02.11.2014 / 07:23