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 dedmesg
o 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
eth
não é necessário, embora wlan
seja.
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.