APU2C2Debian: Porovnání verzí
Řádek 208: | Řádek 208: | ||
== Ladění front na síťové kartě == | == Ladění front na síťové kartě == | ||
Ladění front na NIC má za cíl zvýšit propustnost APU v situaci kdy velký provoz CPU na APU zahltí počtem přerušení od síťové karty. Jak je karta nastavená se můžeme podívat pomocí aplikace ethtool, to co nás zajímá se jmenuje "coalesce", hodnota udává jak často síťovka pošle nabufrovaný provoz dále do CPU, každé takové odeslání vyvolá přerušení a vysoký počet přerušení/s může relativně pomalý CPU na APU utavit. | Ladění front na NIC má za cíl zvýšit propustnost APU v situaci kdy velký provoz CPU na APU zahltí počtem přerušení od síťové karty. Jak je karta nastavená se můžeme podívat pomocí aplikace ethtool, to co nás zajímá se jmenuje "coalesce", hodnota udává jak často síťovka pošle nabufrovaný provoz dále do CPU, každé takové odeslání vyvolá přerušení a vysoký počet přerušení/s může relativně pomalý CPU na APU utavit. | ||
+ | |||
+ | Zda toto nastavení vůbec jde změnit závisí na HW dané síťovky a jejím ovladači, např. síťovky intel a e1000 ovladač většinou problém nemají, některé realtek síťovky se staršími ovladači ano. | ||
+ | |||
+ | Jak je HW nastaven zjistíme takto (pokud je vypsána chyba "Operation not supported" daný ovladač coalesce nastavit neumí): | ||
+ | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
root@hrubinova1:~# ethtool --show-coalesce enp1s0 | grep "usecs" | root@hrubinova1:~# ethtool --show-coalesce enp1s0 | grep "usecs" | ||
stats-block-usecs: 0 | stats-block-usecs: 0 | ||
− | rx-usecs: | + | rx-usecs: 3 |
rx-usecs-irq: 0 | rx-usecs-irq: 0 | ||
− | tx-usecs: | + | tx-usecs: 3 |
root@hrubinova1:~# | root@hrubinova1:~# | ||
</syntaxhighlight> | </syntaxhighlight> | ||
''Hodnotu enp1s0 případně upravte podle názvu síťovky'' | ''Hodnotu enp1s0 případně upravte podle názvu síťovky'' | ||
+ | U intel síťovky i211AT je "by default" nastaveno obsluhování síťovky každé 3usec, tedy každé 3usec (pokud během té doby nějaký paket přijde) je buffer síťovky odeslán do CPU. My v tomto ukázkovém příkladu zvýšíme hodnotu na 1000usec, tedy 1ms, způsobí to sice zvýšení odezvy stroje, ale dost rapidně klesne počet přerušení/s a o to nám jde. Nastavené se provádí následovně: | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | root@hrubinova1:~# ethtool --coalesce enp1s0 rx-usecs 1000 tx-usecs 1000 | ||
+ | root@hrubinova1:~# | ||
+ | </syntaxhighlight> | ||
+ | ''Hodnotu enp1s0 případně upravte podle názvu síťovky'' | ||
+ | |||
+ | Pokud příkaz nevypíše nic, nastavení se nejspíš provedlo a můžeme ho zkontrolovat pomocí přepínače --show-coalesce jako je v příkladu výše. Provedení změny může mít za následek krátké přerušení spojení, ale nemělo by to systém či síťovku nějak "zaseknout". Toto nastení není persistentní, je ten potřeba dělat po každém rebootu, např. v nějakém startup scriptu či v souboru nastavení síťovky. |
Verze z 2. 1. 2019, 12:44
Tento návod pojednává o instalaci OS Debian (bez grafického rozhraní) na PCEngines APU, typ 2C2 (druhá generace APU)
Obsah
Příprava HW
- 1x PCEngines APU 2C2 (případně 2B2), jde o desku s 1GHz quad-core embedded CPU s architekturou AMD64, konkrétně AMD G series GX-412TC, s 2GB nebo 4GB RAM, podrobné info: [1]
- 1x mSATA SSD disk, sám výrobce doporučuje disk Phison 16GB [2]
- 1x 12V zdroj, alesoň 1,5A, samotný APU má spotřebu 6-10W v závislosti na vytížení CPU, výkonová rezerva je tam kvůli perifériím (disk, USB flash, miniPCIe karta, apod.)
- 1x case, který slouží zároveň jako chladič, APU lze provozovat i bez něj, ale jen v krátkých intervalech, kdy nebude zatížen CPU
- 1x flash disk, alespoň 1GB
Sestavení chlazení je zde:
Příprava iso image
Tato část vykládá o vytvoření instalačního image, které se nahraje na flash disk a bude se z něj v APU instalovat systém. Budeme k tomu potřebovat stroj s linuxem a připojení k internetu. předpoklad je, že všechno dělám jako root. Postup:
- vytvoříme si pracovní adresáře, kde budeme manipulovat s daty
mkdir deb-serial
cd deb-serial
- stáhneme si nejnovější iso image debianu formu "netinst", architektura AMD64
wget http://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-8.5.0-amd64-netinst.iso -O debian-amd64-netinst.iso
pozn. je třeba mít nějakou novější instalaci, s verzí 8.3 to údajně nefunguje, APU2C2 je v době psaní návodu na trhu 2 měsíce, jde tedy o hodně nový kus HW
- vytvoříme adresář pro rozbalení image a připojíme pomocí loop stažený image do adresáře
mkdir old
mkdir new
mount -o loop debian-amd64-netinst.iso old
- zkopírujeme veškeré soubory z instalačního image do nové složky abychom je mohli upravit podle toho jak budeme potřebovat (shopt -s dotglob má zajistit, že se budou kopírovat i skryté soubory)
shopt -s dotglob
cp -rv old/* new/
- nyní potřebujeme upravit soubory boot loaderu isolinux/syslinux, tak abychom mohli se systémem pracovat přes seriovou konzoli
nano new/isolinux/isolinux.cfg
nano new/isolinux/txt.cfg
- obsah souborů má být takovýto:
isolinux.cfg:
# D-I config version 2.0
# search path for the c32 support libraries (libcom32, libutil etc.)
serial 0 115200
console 0
path
include menu.cfg
#default vesamenu.c32
#prompt 0
#timeout 0
###########################################
txt.cfg:
default install
label install
menu label ^Install
menu default
kernel /install.amd/vmlinuz
append vga=off console=ttyS0,115200,n8 initrd=/install.amd/initrd.gz --- console=ttyS0,115200,n8
###########################################
Pozornost věnujte i ostatnim .cfg souborům, aby někde nebyla také klauzule "default" a "menu default" instalátor by poté mohl spustit něco jiného než chceme
- dále z upravené instalaci vytvoříme zpět iso image, na debianu 8 k tomu budeme potřebovat pár aplikací:
apt-get install debootstrap squashfs-tools syslinux isolinux syslinux-common xorriso
- image vytvoříme takto:
xorriso -as mkisofs -r -J -joliet-long -l -cache-inodes -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -partition_offset 16 -A "Debian8.2" -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o debian-serial-install.iso ./new/
Umístění souboru isohdpfx.bin se může lišit podle verze isolinux, je proto lepší si potvrdit, že je opravdu tam kde být má: updatedb; locate isohdpfx.bin
- vytvoření image nahrajeme na flshku, místo /dev/sdX se zadá skutečná cesta k flashce
dd if=debian-serial-install.iso of=/dev/sdX bs=1k
- to je vše, můžeme přejít k instalaci na APU
Již připravený image je zde debian-8.5-for-APU-serial-install.iso ,ale netvrdím že tem zůstane napořád update: nově připravený image debian 9: debian-9.0-for-APU-serial-install.iso
připojení k APU přes sériový port
v této části návodu je popis jak propojit PC s APU pomocí sériového portu Potřebujeme PC, které má sériový port, případně USB-RS232 převodník a NULL MODEM sériový kabel Postup je následující:
- PC a APU propojíme sériovým kabelem
- v PC nalezneme ten správný sériový port, bude jich přítomno nejspíše několik - /dev/ttySx, kde x je pořadové číslo portu, který je ten správný můžeme rychle zjistit příkazem concatenate (cat)
cat /dev/ttyS0
- když zapneme APU mělo by se na konzoli něco začít vypisovat i když by byl port nastaven nesprávně měl by vypisovat alespoň "nějaké nesmysly", pokud je to nesprávný port, nebude vypisovat nic, přes příkaz cat bude komunikace vždy jen jednosměrná, přejdeme tedy k programu, který umí komunikovat obousměrně
- pro komunikaci použijeme aplikaci screen nebo minicom, nebo jiný program, který to umí a nastavíme ho tak, aby byla sériová linka nastavena na tyto parametry (jak danou aplikaci nastavit není cílem tohoto návodu):
datový tok: 115200 b/s datových bitů: 8 stop bit: 1 parita: ne SW/HW flow control: ne klasický jednořádkový zápis: 115200 8N1
například:
screen /dev/ttyUSB0 115200
instalace z flash disku
Tato část návodu pojednává o instalaci OS z flash disku
- zasuneme námi připravenou flash do APU a zapneme ho, na konzoli bychom měli vidět informace vypisované BIOSem, poté by měl začít bootovat z flash, případně se pomocí klávesy F10 dá vyvolat boot menu, pokud chceme boot z flash vynutit ručně, APU nemá BIOS s grafickým rozhraním, nelze tedy do něj vlézt a něco nastavovat kromě pořadí boot zařízení.
pokud nejde zařízení ovládat je nejspíše nějak špatně nastavený sériový port, případně je něco špatně s kabelem - není to NULL MODEM, případně je poškozený apod.
- Nyní máme před sebou klasickou instalaci debianu, jako je tomu u běžného PC nebo virtuálu (popis instalace debianu není cílem tohoto návodu).
- Když máme instalaci za sebou, vyjmeme flashku a necháme systém restartovat, posléze by měl naběhnout do přihlašovacího dialogu
- abychom nemuseli systém ovládat přes sériový port nainstalujeme openssh server a nastavíme mu ip adresu
- do /etc/network/interfaces zadat/přidat něco takového:
auto eth1
iface eth1 inet static
address 192.168.1.1
netmask 255.255.255.0
- nainstalovat ssh server:
apt-get update
apt-get install openssh-server
- a restartovat
- po bootu by měl APU být dostupný přes SSH na portu eth1 (ten prostřední ethernet port)
Update BIOS
Update BIOSu není na APU zcela triviální, PCEngines používá vlastní nastylovanou tiny distribuci linuxu, která obsahuje aplikaci, kterou lze BIOS flashnout. Je na to třeba několik kroků:
- Na webu si stáhnout BIOS (firmware) pro svůj typ APU: https://www.pcengines.ch/apu2.htm případně další verze jsou na githubu https://github.com/pcengines/apu2-documentation#mainline
- Stáhnout si instalátor tinyCore linuxu http://pcengines.ch/howto.htm#TinyCoreLinux pro windows (nastylovaný Universal USB Installer od Pendrivelinux) nebo pro linux/MAC
- Nahrát tinyCore na flashku, postup je stejný jako u Universal USB Installer - postup triviální, spustí se program, vybere se flashka, jinak je to jen samé next, next, ...
- nahrát nový BIOS na flashku např. apu2_v4.6.1.rom
- nabootovat APU z připravené flashky - většinou stačí jen zasunout flash a zapnout APU, flashka by měla mít při bootu prioritu
- až nastartuje systém (otázka pár sekund), flashnout nový BIOS:
[root@box:/media/TINYCORE]$ flashrom -w apu2_v4.6.1.rom -p internal
flashrom v0.9.9-r1954-beead91-17 on Linux 4.2.9-tinycore (i686)
flashrom is free software, get the source code at https://flashrom.org
Error accessing high tables, 0x100000 bytes at 0x77fae000
/dev/mem mmap failed: Resource temporarily unavailable
Failed getting access to coreboot high tables.
Found chipset "AMD FCH".
Enabling flash write... OK.
Identifying board "PC Engines apu2"... OK.
Found Winbond flash chip "W25Q64.V" (8192 kB, SPI) mapped at physical address 0xff800000.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.
[root@box:/media/TINYCORE]$
Po rebootu by měl najet novější BIOS:
PC Engines apu2
coreboot build 08/30/2017
BIOS version v4.6.1
2032 MB DRAM
SeaBIOS (version rel-1.10.2.1)
Press F10 key now for boot menu
Ladění přerušení
Po nasazení APU na Andre, kde je běžný provoz v řádu stovek mbit/s se vyskytl problém s tím, že CPU přestal stíhat obsluhovat přerušení od síťového adaptéru a tím pádem začal proces ksoftirqd (řažení fronty přerušení) velmi vytěžovat CPU, problém je, že servisa irqbalance by default přiřazuje jen jedno jádro CPU per síťové rozhraní a jedno jádro pak nestíhá odbavovat velký počet přerušení/s, částečné řešení je nastavit, aby přerušení od jednoho síťového rozhraní obsluhovala všechna jádra (přerušení se z pohledu x86 architektury řeší per jádro, nikoli per fyzický CPU).
V našem případě je uplink routru rozhraní enp1s0, pomocí příkazu cat /proc/interrupts | grep enp1s0 si zjistím které číslo přerušení (IRQ) má daný interface:
root@Andre1:~# cat /proc/interrupts | grep -E "enp1s0|CPU"
CPU0 CPU1 CPU2 CPU3
37: 0 0 0 1 PCI-MSI 524288-edge enp1s0
38: 1 3099457491 1 2 PCI-MSI 524289-edge enp1s0-rx-0
39: 0 0 29608 301086 PCI-MSI 524290-edge enp1s0-rx-1
40: 0 530 3 2703231872 PCI-MSI 524291-edge enp1s0-tx-0
41: 5 1 2694883102 0 PCI-MSI 524292-edge enp1s0-tx-1
Zde je vidět, že přerušení od interfacu obsluhují jen některá jádra (někde je počet obsloužených přerušení 0 nebo velmi malé číslo) číslo ve sloupci udává počet obsloužených přerušení daným jádrem CPU. Náš cíl je tedy rozprostřít využití všech obsluhy přerušení mezi všechna jádra. To se dá manuálně provést tak, že budeme editovat soubor /proc/irq/$číslo_přerušení/smp_affinity, kde je přiřazený CPU pro dané přerušení vyjádřen binární notací a hexadecimálním číslem. První krok je stopnout a disablovat službu irqbalance, aby se nám už nesnažila "balancovat" využití CPU:
root@Andre1:~# systemctl stop irqbalance.service
root@Andre1:~# systemctl disable irqbalance.service
Synchronizing state of irqbalance.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable irqbalance
Poté přiřadíme do smp_affinity hodnotu tak, aby přerušení obsluhovala všechna, v našem případě 4, jádra binární notace vypadá následovně: každá jednička v hodnotě znamená povolení použití daného jádra k obsluze přerušení s tím, že nejnižší bit je CPU0 (tedy 1. jádro) a nejvyšší je CPU3 (tedy 4. jádro), pokud budu chtít využít všechna jádra, jednoduše dám všude jedničky: 1111b = 0xf, pokud by byl systém např. šestijádrový, hodnota by byla 11 1111b = 0x3f, u osmijádrového: 1111 1111b = 0xff atp.
Rozhraní enpXsY má přerušení rozdělená ještě na RX a TX složky, nastavit tedy musíme všechny složky:
root@Andre1:~# echo f > /proc/irq/38/smp_affinity
root@Andre1:~# echo f > /proc/irq/39/smp_affinity
root@Andre1:~# echo f > /proc/irq/40/smp_affinity
root@Andre1:~# echo f > /proc/irq/41/smp_affinity
Výsledek by měl vypadat pak nějak takto:
root@Andre1:~# cat /proc/interrupts | grep -E "enp1s0|CPU"
CPU0 CPU1 CPU2 CPU3
37: 0 0 0 1 PCI-MSI 524288-edge enp1s0
38: 155944 3106163509 165386 179882 PCI-MSI 524289-edge enp1s0-rx-0
39: 8 12 29629 301758 PCI-MSI 524290-edge enp1s0-rx-1
40: 105030 105696 112549 2709126908 PCI-MSI 524291-edge enp1s0-tx-0
41: 125211 125009 2700441807 146260 PCI-MSI 524292-edge enp1s0-tx-1
Zde je vidět, že přerušení už obsluhují všechna jádra, výsledek by měl být nižší celkové zatížení CPU a hlavně by se už neměla, nebo alespoň ne moc, přerušení řadit v procesu ksoftirqd, vytížení jader by mělo být ideálně stejné.
Ladění front na síťové kartě
Ladění front na NIC má za cíl zvýšit propustnost APU v situaci kdy velký provoz CPU na APU zahltí počtem přerušení od síťové karty. Jak je karta nastavená se můžeme podívat pomocí aplikace ethtool, to co nás zajímá se jmenuje "coalesce", hodnota udává jak často síťovka pošle nabufrovaný provoz dále do CPU, každé takové odeslání vyvolá přerušení a vysoký počet přerušení/s může relativně pomalý CPU na APU utavit.
Zda toto nastavení vůbec jde změnit závisí na HW dané síťovky a jejím ovladači, např. síťovky intel a e1000 ovladač většinou problém nemají, některé realtek síťovky se staršími ovladači ano.
Jak je HW nastaven zjistíme takto (pokud je vypsána chyba "Operation not supported" daný ovladač coalesce nastavit neumí):
root@hrubinova1:~# ethtool --show-coalesce enp1s0 | grep "usecs"
stats-block-usecs: 0
rx-usecs: 3
rx-usecs-irq: 0
tx-usecs: 3
root@hrubinova1:~#
Hodnotu enp1s0 případně upravte podle názvu síťovky U intel síťovky i211AT je "by default" nastaveno obsluhování síťovky každé 3usec, tedy každé 3usec (pokud během té doby nějaký paket přijde) je buffer síťovky odeslán do CPU. My v tomto ukázkovém příkladu zvýšíme hodnotu na 1000usec, tedy 1ms, způsobí to sice zvýšení odezvy stroje, ale dost rapidně klesne počet přerušení/s a o to nám jde. Nastavené se provádí následovně:
root@hrubinova1:~# ethtool --coalesce enp1s0 rx-usecs 1000 tx-usecs 1000
root@hrubinova1:~#
Hodnotu enp1s0 případně upravte podle názvu síťovky
Pokud příkaz nevypíše nic, nastavení se nejspíš provedlo a můžeme ho zkontrolovat pomocí přepínače --show-coalesce jako je v příkladu výše. Provedení změny může mít za následek krátké přerušení spojení, ale nemělo by to systém či síťovku nějak "zaseknout". Toto nastení není persistentní, je ten potřeba dělat po každém rebootu, např. v nějakém startup scriptu či v souboru nastavení síťovky.