저는 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
.
누구든지 이 봇을 더 빨리 부팅하는 방법에 대한 실행 가능한 조언으로 해석할 수 있습니까? 이러한 메시지에 정보가 충분하지 않은 경우 추가 조사를 위해 무엇을 더 시도할 수 있습니까?
편집하다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
Ubuntu의 서버 설치가 실제로 올바른 방법인지 확실하지 않습니다. 설명하는 내용이 Archlinux 또는 저와 유사한 작업처럼 들리기 때문입니다.
시스템에서 많은 사용자 정의를 수행해야 합니다. 이는 "기본 시스템을 사용하고 필요한 것을 추가하는" 접근 방식이 "전체 설치를 사용하고 불필요한 것(예: apport, apparmor, dhcp)을 제거하는 것보다 쉽습니다. ...)" 하나.
그러나 어쨌든 부팅 시간 단축에 관한 위키 항목이 실제로 있습니다. Ubuntu 시스템에서는 명령이 1:1로 변환되지 않을 수 있지만 이 항목이 올바른 방향을 가리킬 수 있습니다.
https://wiki.archlinux.org/index.php/Improve_boot_performance
죄송합니다. 장치별 부팅 시간을 줄이는 것은 askubuntu에서 처리할 수 있는 짧은 대답이 아닙니다. 시작 루틴의 모든 항목을 살펴보고 필요한지 여부를 결정하고 그에 따라 시스템 구성 요소를 비활성화해야 합니다.
답변2
이것은 기본적으로 무언가를 깨뜨릴 때까지 빼기를 시작한 다음 다시 중단하는 응용 프로그램 중 하나입니다. 예를 들어, 귀하의 로봇이 avahi 데몬인 zeroconf를 사용하고 있을 가능성이 없다고 생각하므로 제거하십시오. 정말 네트워킹이 필요한가요? 또는 단일 사용자 모드로 부팅한 다음(커널 cmdline에 1 추가) 애플리케이션이 작동하기 전에 얼마나 많은 서비스를 켜야 하는지 확인하는 것이 좋습니다.
답변3
당신은 어느 사이즈 부문에 속해 있나요? 이것이 여러분이 여기서 찾고 있는 답이 아닐 수도 있다는 것을 알고 있지만, 10초 이내에 일어서는 것과 같이 시간이 중요한 작업의 경우에는 내장형 플랫폼을 사용하겠습니다.
공간/전력 예산이 있다면 로봇에 아두이노 같은 것을 붙이고 개방 루프 스탠드업 동작을 프로그래밍하는 것을 고려해야 합니다. 메인보드에서는 여전히 우분투를 사용할 수 있습니다. 나는 다음과 같은 것을 제안하고 싶습니다 :
- 우분투 서버로부터 정기적인 하트비트 신호를 수신하는 Arduino(또는 유사한)가 있습니다.
- X 이상의 하트비트 간격이 지나면 Arduino가 제어권을 갖고 서버를 재부팅합니다.
- Arduino는 모터를 직접 구동하거나(또는 사용 중인 모터 컨트롤러를 통해) 스탠드업 명령을 내릴 수 있습니다. 이를 통해 메인 시스템이 부팅되는 동안 로봇이 "복구"하고 자격을 상실하지 않게 됩니다.
- 로봇이 향하는 방향에 따라 몇 가지 일어서기 동작을 미리 프로그래밍한 다음 가속도계에 따라 그중 하나를 선택합니다.
- 다리가 있는 구역 중 하나에 있지 않다면 ardiuno에 싸구려 코드를 작성하여 서버가 부팅되는 동안 로봇이 뭔가를 하고 있는 것처럼 보이도록 하세요.
- 시스템이 부팅되면 또 다른 하트비트를 보내고 Arduino는 제어를 해제할 수 있습니다.
여기에는 부팅 시간을 개선하는 데 도움이 될 수 있는 답변이 있습니다(기본적으로 문제가 발생할 때까지 전원을 끄는 것). 하지만 전원이 꺼지는 것이 일반적인 문제라면 이와 같은 것이 매우 도움이 될 수 있습니다.
답변4
저장소 버퍼를 4MB로 줄여보세요. /etc/sysctl.conf에 다음을 작성하십시오.
vm.dirty_bytes = 4194304 vm.dirty_Background_bytes = 1048576
또한 쓰기 시간을 3초로 줄일 수도 있습니다.
vm.dirty_expire centisecs = 300 vm.dirty_writeback_centisecs = 300
이것이 도움이 되었는지 아닌지 의견을 말해주세요. 감사합니다.