El robot que ejecuta Linux tarda en arrancar

El robot que ejecuta Linux tarda en arrancar

Estoy trabajando con una plataforma robótica (para usar en la competencia RoboCup) y ejecutamos Ubuntu Server 13.10. Es fundamental durante los partidos que nuestros robots puedan arrancar lo más rápido posible. Es más, si realiza un ciclo de energía durante una caída, el robot tiene 10 segundos para volver a la vida antes de ser retirado del campo.

Actualmente el tiempo de arranque es de unos 15 segundos y me gustaría saber qué puedo hacer para reducir ese tiempo. Ojalá yo también pueda aprender algo.

Aquí está el resultado completo dedmesglo que supongo que ayuda a desglosar lo que sucede en cada paso del tiempo. Hay algunas lagunas en el resultado:

  • En 0,41 hay una diferencia de aproximadamente 0,8 segundos
  • A 3,64 hay una diferencia de unos 2,8 segundos.
  • En 9,67 hay una diferencia de aproximadamente 0,8 segundos.
  • A las 12,9 hay una diferencia de aproximadamente 1,4 segundos.

ethAunque no wlanes necesario.

¿Alguien puede decodificar esto en consejos prácticos sobre cómo hacer que este bot arranque más rápido? Y si no hay suficiente información en estos mensajes, ¿qué más podría intentar investigar más a fondo?


EDITARModifiqué mi binario (que se inicia automáticamente como un trabajo inicial) para escribir en el syslog. Muestra, comenzando con el primer mensaje registrado después de encender:

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

Lo extraño es que también cronometré con un cronómetro. Desde que encendí la alimentación hasta el inicio de mi proceso (el robot cobró vida) fueron 35 segundos. Parece que algo está provocando que la escritura del syslog se retrase 100 segundos más, según las marcas de tiempo.

Respuesta1

No estoy seguro de si una instalación de servidor de Ubuntu es realmente el camino correcto a seguir, porque lo que estás describiendo suena como un trabajo para archlinux o similar para mí.

Necesitará hacer mucha personalización en su sistema, que es cuando un enfoque de "tomar un sistema base y agregar todo lo necesario" es más fácil que "usar una instalación completa y eliminar todo lo innecesario (por ejemplo, apport, apparmor, dhcp ...)" uno.

Pero de todos modos, en realidad HAY una entrada wiki sobre cómo reducir el tiempo de arranque. Es posible que los comandos no se traduzcan 1 a 1 para su sistema Ubuntu, pero esta entrada puede indicarle la dirección correcta:

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

Lo siento, pero reducir el tiempo de arranque específico del dispositivo no es nada que una respuesta corta en Askubuntu pueda manejar, tendrás que mirar cada elemento de tu rutina de inicio y decidir si es necesario o no y deshabilitar los componentes del sistema en consecuencia.

Respuesta2

Esta es una de esas aplicaciones en las que básicamente empiezas a restar hasta que rompes algo y luego retrocedes. Por ejemplo, no creo que su robot esté usando zeroconf, que es el demonio avahi, así que desinstálelo. ¿Realmente necesitas networking? O mejor, inicie en modo de usuario único (agregue 1 a la línea cmd del kernel) y luego vea cuántos servicios debe activar antes de que su aplicación comience a funcionar.

Respuesta3

¿En qué división de tallas estás? Me doy cuenta de que esta puede no ser la respuesta que estás buscando aquí, pero para algo crítico como levantarte en 10 segundos, elegiría una plataforma integrada.

Si tiene el presupuesto de espacio/energía, debería considerar colocar algo como un arduino en el robot y programar algunos comportamientos de pie de circuito abierto. Aún puedes usar ubuntu en la placa principal. Yo sugeriría algo como esto:

  • Tener un arduino (o similar) que reciba una señal de latido regular del servidor ubuntu
  • Si pasan más de X intervalos de latidos, el arduiono toma el control y reinicia el servidor.
  • El arduino puede accionar directamente los motores (o mediante cualquier controlador de motor que esté usando) y emite un comando de puesta en pie, lo que permite que el robot se "recupere" y no quede descalificado, mientras su sistema principal se inicia.
    • Preprograme algunos comportamientos de pie, posiblemente en función de la dirección en la que mira el robot, y luego seleccione uno de ellos basándose en un acelerómetro.
    • Si no estás en una de las divisiones con patas, simplemente escribe un código cursi en el ardiuno para que parezca que el robot está haciendo algo mientras el servidor se inicia.
  • Una vez que el sistema se inicia, enviará otro latido y el arduino podrá liberar el control.

Aquí hay respuestas que pueden ayudarlo a mejorar el tiempo de arranque (apague todo hasta que se rompa, básicamente), pero incluso entonces, si perder energía es un problema bastante común, algo como esto podría ser muy útil.

Respuesta4

Intente reducir el búfer de almacenamiento a 4 MB. En /etc/sysctl.conf escribe:

vm.dirty_bytes = 4194304 vm.dirty_background_bytes = 1048576

También tal vez reduzca el tiempo de escritura a 3 segundos.

vm.dirty_expire centisecs = 300 vm.dirty_writeback_centisecs = 300

Por favor comente si esto ayudó o no. Gracias.

información relacionada