Linux 搭載ロボットの起動が遅い

Linux 搭載ロボットの起動が遅い

私はロボット プラットフォーム (RoboCup 競技会で使用する) に取り組んでおり、Ubuntu Server 13.10 を実行しています。試合中は、ロボットができるだけ早く起動できることが重要です。さらに、ロボットが落下中に電源を入れ直した場合、フィールドから取り除かれる前に、ロボットは 10 秒以内に復活する必要があります。

現在、起動時間は約 15 秒ですが、その時間を短縮するにはどうすればよいかを知りたいです。私も何かを学べるといいのですが。

以下は、dmesgこれは、各タイムステップで何が起こっているかを分析するのに役立つと思います。出力にはいくつかのギャップがあります。

  • 0.41では約0.8秒の差がある
  • 3.64では約2.8秒の差がある
  • 9.67では約0.8秒の差がある
  • 12.9では約1.4秒の差がある

ethただし必須ではありませんwlan

これを解読して、このボットをより早く起動するための実用的なアドバイスをくれる人はいますか? また、これらのメッセージに十分な情報がない場合、他に何をさらに調査すればよいでしょうか?


編集バイナリ (upstart ジョブとして自動的に起動する) を変更して、syslog に書き込むようにしました。電源投入後の最初のログ メッセージから表示されます。

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

奇妙なことに、ストップウォッチで時間を計りました。電源を入れてからプロセスが開始するまで (ロボットが起動するまで) は 35 秒でした。タイムスタンプから判断すると、何らかの原因で syslog の書き込みがさらに 100 秒遅れているようです。

答え1

あなたが説明していることは、ArchLinux またはそれに類似した作業のように思えるので、Ubuntu のサーバー インストールが本当に正しい方法であるかどうかはわかりません。

システムをかなりカスタマイズする必要がありますが、その場合、「ベース システムを取得して必要なものを追加する」アプローチは、「本格的なインストールを使用して不要なもの (apport、apparmor、dhcp など) を削除する」アプローチよりも簡単です。

いずれにせよ、起動時間を短縮することに関する wiki エントリが実際に存在します。コマンドは Ubuntu システムでは 1 対 1 で変換されないかもしれませんが、このエントリが正しい方向を指し示している可能性があります。

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

申し訳ありませんが、デバイス固有の起動時間を短縮することは、askubuntu の短い回答では対応できないため、起動ルーチンのすべての項目を確認し、必要かどうかを判断し、それに応じてシステム コンポーネントを無効にする必要があります。

答え2

これは、基本的に何かを壊すまで減らし始めて、それから元に戻すようなアプリケーションの 1 つです。たとえば、ロボットが avahi デーモンである zeroconf を使用している可能性は低いと思うので、アンインストールします。本当にネットワークが必要ですか? または、シングル ユーザー モードで起動し (カーネル コマンドラインに 1 を追加)、アプリケーションが動作し始める前にオンにする必要があるサービスの数を確認します。

答え3

あなたはどのサイズ区分に属していますか? これはあなたがここで探している答えではないかもしれませんが、10 秒以内に立ち上がるなど、時間的に重要な場合には、組み込みプラットフォームをお勧めします。

スペースと電力の予算に余裕がある場合は、ロボットに Arduino のようなものを取り付けて、オープンループの立ち上がり動作をプログラミングすることを検討してください。メインボードでは Ubuntu を使用することもできます。次のようなものをお勧めします。

  • Ubuntuサーバーから定期的にハートビート信号を受信するArduino(または同様のもの)を用意する
  • X以上のハートビート間隔が経過すると、Arduionoが制御を引き継ぎ、サーバーを再起動します。
  • Arduinoはモーターを直接(または使用しているモーターコントローラーを介して)駆動し、メインシステムが起動している間にロボットが「回復」して失格にならないようにするスタンドアップコマンドを発行できます。
    • ロボットが向いている方向に基づいて、いくつかの立ち上がり動作を事前にプログラムし、加速度計に基づいてそのうちの1つを選択します。
    • 脚のある部門に所属していない場合は、Ardiuno に簡単なコードを書いて、サーバーが起動している間にロボットが何かしているように見せてください。
  • システムが起動すると、別のハートビートが送信され、Arduinoは制御を解放できます。

起動時間を改善するのに役立つ回答がここにあります (基本的には、壊れるまで電源をオフにします)。ただし、それでも、電源が失われることがよくある問題である場合は、このようなものが非常に役立つ可能性があります。

答え4

ストレージ バッファを 4 MB に減らしてみてください。/etc/sysctl.conf に次のように記述します。

vm.dirty_bytes = 4194304 vm.dirty_background_bytes = 1048576

書き込み時間を3秒に短縮することも可能

vm.dirty_expire センチ秒 = 300 vm.dirty_writeback_センチ秒 = 300

これが役に立ったかどうかコメントしてください。ありがとうございます。

関連情報