Der Roboter mit Linux bootet langsam

Der Roboter mit Linux bootet langsam

Ich arbeite mit einer Roboterplattform (für den Einsatz im RoboCup-Wettbewerb) und wir verwenden Ubuntu Server 13.10. Bei Spielen ist es wichtig, dass unsere Roboter so schnell wie möglich hochfahren können. Und wenn sie während eines Sturzes aus- und wieder eingeschaltet werden, hat der Roboter 10 Sekunden Zeit, um wieder zum Leben zu erwachen, bevor er vom Feld genommen wird.

Derzeit beträgt die Startzeit etwa 15 Sekunden und ich würde gerne wissen, was ich tun kann, um diese Zeit zu verkürzen. Hoffentlich kann ich auch etwas lernen.

Hier ist die vollständige Ausgabe vondmesgwas meiner Meinung nach dabei hilft, aufzuschlüsseln, was bei jedem Zeitschritt passiert. Es gibt einige Lücken in der Ausgabe:

  • Bei 0,41 besteht eine Lücke von etwa 0,8 Sekunden
  • Bei 3,64 besteht eine Lücke von etwa 2,8 Sekunden
  • Bei 9,67 besteht eine Lücke von etwa 0,8 Sekunden
  • Bei 12,9 beträgt die Lücke etwa 1,4 Sekunden

ethist aber nicht erforderlich wlan.

Kann das jemand in umsetzbare Ratschläge umwandeln, wie man diesen Bot schneller booten kann? Und wenn diese Nachrichten nicht genügend Informationen enthalten, was könnte ich sonst noch versuchen, genauer zu untersuchen?


BEARBEITENIch habe meine Binärdatei (die automatisch als Upstart-Job gestartet wird) so geändert, dass sie in das Syslog schreibt. Es zeigt, beginnend mit der ersten protokollierten Nachricht nach dem Einschalten:

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

Das Seltsame ist, dass ich auch die Zeit mit einer Stoppuhr gemessen habe. Vom Einschalten bis zum Starten meines Prozesses (dem Erwachen des Roboters) vergingen 35 Sekunden. Den Zeitstempeln nach zu urteilen, scheint irgendetwas die Verzögerung des Syslog-Schreibens um weitere 100 Sekunden zu verursachen.

Antwort1

Ich bin mir nicht sicher, ob eine Serverinstallation von Ubuntu wirklich der richtige Weg ist, denn was du beschreibst, klingt für mich nach einer Aufgabe für Archlinux oder ähnliches.

Sie werden eine Menge Anpassungen an Ihrem System vornehmen müssen. In diesem Fall ist der Ansatz „Nehmen Sie ein Basissystem und fügen Sie alles hinzu, was benötigt wird“ einfacher als der Ansatz „Verwenden Sie eine vollwertige Installation und entfernen Sie alles Unnötige (z. B. Apport, Apparmor, DHCP ...)“.

Aber wie dem auch sei, es gibt tatsächlich einen Wiki-Eintrag, der sich mit der Reduzierung der Startzeit beschäftigt. Die Befehle lassen sich möglicherweise nicht 1:1 auf Ihr Ubuntu-System übertragen, aber dieser Eintrag könnte Sie in die richtige Richtung weisen:

https://wiki.archlinux.org/index.php/Boot-Leistung_verbessern

Es tut mir leid, aber die Reduzierung der gerätespezifischen Startzeit ist nichts, was sich mit einer kurzen Antwort auf Askubuntu beheben lässt. Sie müssen sich jedes Element in Ihrer Startroutine ansehen und entscheiden, ob es notwendig ist oder nicht, und die Systemkomponenten entsprechend deaktivieren.

Antwort2

Dies ist eine dieser Anwendungen, bei denen Sie im Grunde genommen so lange abziehen, bis etwas kaputt geht, und dann wieder aufhören. Ich glaube beispielsweise nicht, dass Ihr Roboter Zeroconf verwendet, den Avahi-Daemon, also deinstallieren Sie ihn. Brauchen Sie wirklich ein Netzwerk? Oder besser noch, booten Sie im Einzelbenutzermodus (fügen Sie 1 an die Kernel-Befehlszeile an) und sehen Sie dann, wie viele Dienste Sie aktivieren müssen, bevor Ihre Anwendung funktioniert.

Antwort3

In welcher Größenklasse sind Sie? Mir ist klar, dass das vielleicht nicht die Antwort ist, die Sie hier suchen, aber für etwas Zeitkritisches wie das Aufstehen innerhalb von 10 Sekunden würde ich eine eingebettete Plattform wählen.

Wenn Sie über das nötige Platz-/Strombudget verfügen, sollten Sie in Erwägung ziehen, so etwas wie einen Arduino auf den Roboter zu setzen und einige Open-Loop-Stand-up-Verhaltensweisen zu programmieren. Sie können weiterhin Ubuntu auf der Hauptplatine verwenden. Ich würde so etwas vorschlagen:

  • Besitzen Sie einen Arduino (oder ähnliches), der ein regelmäßiges Heartbeat-Signal vom Ubuntu-Server empfängt
  • Wenn mehr als X Heartbeat-Intervalle vergehen, übernimmt der Arduino die Kontrolle und startet den Server neu
  • Der Arduino kann die Motoren direkt antreiben (oder über den von Ihnen verwendeten Motorcontroller) und gibt einen Standup-Befehl aus, der es dem Roboter ermöglicht, sich zu „erholen“ und nicht disqualifiziert zu werden, während Ihr Hauptsystem hochfährt.
    • Programmieren Sie einige Aufstehverhaltensweisen vor, möglicherweise basierend auf der Blickrichtung des Roboters, und wählen Sie dann eines davon basierend auf einem Beschleunigungsmesser aus.
    • Wenn Sie nicht zu einer der Beinabteilungen gehören, schreiben Sie einfach einen billigen Code auf den Arduino, damit es so aussieht, als würde der Roboter etwas tun, während der Server hochfährt.
  • Sobald das System hochfährt, sendet es einen weiteren Heartbeat und der Arduino kann die Kontrolle freigeben

Hier gibt es Antworten, die Ihnen dabei helfen können, die Startzeit zu verkürzen (im Grunde genommen, indem Sie Dinge ausschalten, bis sie kaputt gehen), aber selbst dann könnte so etwas sehr hilfreich sein, wenn ein Stromausfall ein recht häufiges Problem ist.

Antwort4

Versuchen Sie, den Speicherpuffer auf 4 MB zu reduzieren. Schreiben Sie in /etc/sysctl.conf:

vm.dirty_bytes = 4194304 vm.dirty_background_bytes = 1048576

auch die Schreibzeit auf 3 Sekunden reduzieren

vm.dirty_expire Centisecs = 300 vm.dirty_writeback_Centisecs = 300

Bitte kommentieren Sie, ob dies geholfen hat oder nicht. Danke.

verwandte Informationen