Я работаю с роботизированной платформой (для использования в соревновании 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 job) для записи в syslog. Он показывает, начиная с первого зарегистрированного сообщения после powered:
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
Я не уверен, что установка Ubuntu на сервере — это действительно правильный путь, потому что то, что вы описываете, похоже на работу для archlinux или чего-то подобного.
Вам придется выполнить множество настроек в вашей системе, и подход «взять базовую систему и добавить все необходимое» проще, чем «использовать полноценную установку и удалить все ненужное (например, apport, apparmor, dhcp ...)».
Но в любом случае, на самом деле ЕСТЬ запись в вики о сокращении времени загрузки. Команды могут не переводиться 1 в 1 для вашей системы Ubuntu, но эта запись может указать вам правильное направление:
https://wiki.archlinux.org/index.php/Улучшение_производительности_загрузки
Извините, но сокращение времени загрузки для конкретного устройства — это не то, что можно сделать с помощью краткого ответа на askubuntu. Вам придется просмотреть каждый элемент в вашей процедуре запуска и решить, необходим он или нет, и соответствующим образом отключить системные компоненты.
решение2
Это одно из тех приложений, где вы в основном начинаете вычитать, пока что-нибудь не сломаете, а затем отступаете. Например, я не думаю, что ваш робот, вероятно, использует zeroconf, который является демоном avahi, поэтому удалите его. Вам действительно нужна сеть? Или лучше загрузитесь в однопользовательском режиме (добавьте 1 к командной строке ядра), а затем посмотрите, сколько служб вам нужно включить, чтобы ваше приложение начало работать.
решение3
В каком подразделении по размеру вы находитесь? Я понимаю, что это может быть не тот ответ, который вы ищете, но для чего-то критичного по времени, например, встать в течение 10 секунд, я бы выбрал встроенную платформу.
Если у вас есть бюджет пространства/мощности, вам следует рассмотреть возможность установки на робота чего-то вроде arduino и программирования некоторых открытых вертикальных поведений. Вы по-прежнему можете использовать ubuntu на основной плате. Я бы предложил что-то вроде этого:
- Иметь Arduino (или аналогичный), который получает регулярный сигнал сердцебиения от сервера Ubuntu
- Если прошло больше X интервалов сердцебиения, Arduiono берет управление на себя и перезагружает сервер.
- Arduino может напрямую управлять двигателями (или через любой другой контроллер двигателей, который вы используете) и выдавать команду на вставание, которая позволяет роботу «восстановиться» и не быть дисквалифицированным, пока загружается ваша основная система.
- Заранее запрограммируйте несколько вариантов поведения при вставании, возможно, в зависимости от того, в какую сторону смотрит робот, а затем выберите один из них на основе показаний акселерометра.
- Если вы не относитесь ни к одному из подразделений с ногами, то просто напишите какой-нибудь прикольный код на Ardiuno, чтобы было похоже, что робот что-то делает, пока загружается сервер.
- После загрузки системы она отправит еще один тактовый импульс, и Arduino сможет передать управление.
Здесь есть ответы, которые могут помочь вам сократить время загрузки (по сути, выключайте все, пока не сломаете его), но даже в этом случае, если отключение питания является достаточно распространенной проблемой, что-то вроде этого может быть очень полезным.
решение4
Попробуйте уменьшить буфер хранения до 4 МБ. В /etc/sysctl.conf напишите:
vm.dirty_bytes = 4194304 vm.dirty_background_bytes = 1048576
также возможно сократить время записи до 3 секунд
vm.dirty_expire сентисекс = 300 vm.dirty_writeback_сентисекс = 300
Пожалуйста, прокомментируйте, помогло ли это или нет. Спасибо.