我正在使用一个机器人平台(用于 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 作业自动启动)以写入系统日志。它显示,从启动后的第一条记录消息开始:
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 秒。根据时间戳,似乎有什么东西导致系统日志写入又延迟了 100 秒。
答案1
我不确定 Ubuntu 的服务器安装是否真的是正确的选择,因为您所描述的听起来像是 archlinux 的工作或对我来说类似的工作。
您将需要对系统进行大量定制,在这种情况下,“采用基本系统并添加任何需要的内容”的方法比“使用完整安装并删除任何不必要的内容(例如 apport、apparmor、dhcp...)”的方法更容易。
但无论如何,确实有一篇 wiki 条目专门介绍如何减少启动时间。这些命令可能无法为您的 Ubuntu 系统进行 1to1 转换,但此条目可能会为您指明正确的方向:
https://wiki.archlinux.org/index.php/Improve_boot_performance
很抱歉,但减少特定于设备的启动时间并不是 askubuntu 上的简短答案可以解决的,您必须查看启动例程中的每一项并决定是否有必要并相应地禁用系统组件。
答案2
这是那些基本上会开始减法直到破坏某些东西然后退出的应用程序之一。例如,我认为您的机器人不太可能使用 zeroconf,即 avahi 守护程序,因此请卸载它。您真的需要网络吗?或者更好的方法是,启动到单用户模式(将 1 附加到内核命令行),然后查看在应用程序开始工作之前您必须打开多少服务。
答案3
您属于哪个规模部门?我知道这可能不是您在这里寻找的答案,但对于时间紧迫的事情,例如在 10 秒内站起来,我会选择嵌入式平台。
如果您有足够的空间/功率预算,您应该考虑在机器人上安装类似 arduino 的东西,并编程一些开环站立行为。您仍然可以在主板上使用 ubuntu。我建议这样做:
- 有一个 arduino(或类似产品)从 ubuntu 服务器接收定期心跳信号
- 如果超过 X 个心跳间隔,arduiono 将接管控制并重新启动服务器
- arduino 可以直接驱动电机(或通过你使用的任何电机控制器)并发出站立命令,这允许机器人在主系统启动时“恢复”并且不会被取消资格
- 预先编程一些站立行为,可能基于机器人所面对的方向,然后根据加速度计选择其中一种
- 如果你不属于腿部部门,那么只需在 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
请评论这是否有帮助。谢谢。