Temat dotyczący optymalizacji danego systemu operacyjnego pod konkretne urządzenie to dość obszerny zakres wiedzy. W przypadku Raspberry z uwagi na to iż system pracuje na karcie pamięci SD, która nawet jeśli jest szybka w kontekście transferu to ma ograniczonia co do IOPS ( operacji wejścia/wyjścia na sekundę ). A ilość operacji IOPS jest tutaj decydująca gdyż dane są rozlokowane w różnych miejscach i są to czasem dość małe porcje danych. To nie CPU czy RAM jest ograniczeniem i wąskim gardłem w przypadku Raspberry tylko pamięć masowa i wszystkie związane z tym typem nośników wady. Porady zawarte w poniższym tekście oczywiście nie dotyczą samego Raspberry z OS Raspbian i Ubuntu Mate ale także starszych komputerów jak i innych mini komputerków typu Orage PC Pi, Banana Pi a także systemów uruchamianych na wirtualnych maszynach np. na VirtualBox, VMWare czy inne.
Optymalizacja systemu Linux
Poniższe porady zostały przetestowane zarówno na dystrybucji Raspbian jak i na Ubuntu Mate ( w przypadku Ubuntu Mate także na X86 ).
+ Zmiana środowiska graficznego
W tym wypadku główną przyczyną zmiany środowiska graficznego na lżejsze jest zmniejszenie zapotrzebowania na pamięć RAM jak również zmniejszenie obciążenia CPU poprzez zbędne efekty wizualne. W przypadku Ubuntu Mate możemy zmienić środowisko graficzne na nieco lżejsze niż domyślny MATE. W Raspberry mamy domyślnie LXDE – tutaj możemy poeksperymentować z XFCE jak i MATE oba są nieco „cięższe” ale nie na tyle aby uniemożliwić normalną pracę.
W naszym przypadku wybieramy LXDE z uwagi na lekkość GUI jak i bardzo mały apetyt na pamięć ( ok. 50MB ) dla przykładu główny konkurent w tej kategorii XFCE zajmuje ok. 200MB pamięci na starcie.
sudo apt-get -y install lubuntu-desktop lxde
Po przeprowadzeniu instalacji, należy się wylogować i na ekranie logowania w prawym górnym rogu wybrać odpowiednie środowisko graficzne. Oczywiście środowisko Mate wciąż jest dostępne.
Możemy również zrezygnować z uruchamiania środowiska graficznego podczas startu systemu. Tak aby system pracował domyślnie w środowisku tekstowym i w razie potrzeby uruchamiać tryb graficzny. Aby to zrobić należy wyłączyć menadźera logowania LightDM:
sudo systemctl disable lightdm
I tutaj drobna uwaga, jeśli będziemy chcieli wrócić do stanu poprzedniego to ustawienie opcji na enable przy systemctl nie zadziała zgodnie z naszymi oczekiwaniami. Należy wykonać przekonfigurowanie LightDM – konfiguracja powróci do stanu poprzedniego a w zasadzie do stanu domyślnego:
dpkg-reconfigure lightdm
+ Kompresja pamięci
Dzięki zram możemy kompresować zawartość pamięci RAM. Musimy określić wielkość pamięci jaka będzie poddawana kompresji, na przykład dla 1GB pamięci RAM ustawiamy wielkość 200MB. Ta pamięć będzie działać jako pamięć SWAP o wyższym priorytecie, tak więc w pierwszej kolejności dane nie mieszczące się w podstawowej pamięci RAM będą przesyłane do pamięci przydzielonej dla zram i tam też będzie poddawana kompresji.
W Ubuntu Mate jak i Raspbiannie i większości innych dystrybucji linuksowych zram jest wbudowany w jądro systemu od wersji 3.14
Poniżej podstawa konfiguracja zram zapisana jako skrypt:
#!/bin/bash modprobe zram echo $((200*1024*1024)) > /sys/block/zram0/disksize # 200 MB mkswap /dev/zram0 swapon -p 60 /dev/zram0
Powyższe polecenia wykonują następujące czynności: załadowanie sterownika zram, przydzielenie pamięci blokowej dla zram, utworzenie dysku zram jako SWAP i ustawienie wyższego priorytetu dla dysku zram0.
W katalogu /sys/block/zram0 możemy wylistować sobie z plików więcej informacji na temat dysku zram0:
na przykład:
Polecenie | Opis |
---|---|
cat compr_data_size | wielkość danych, które zostały poddane kompresji |
cat mem_used_tota | ilość wykorzystanej pamięci |
swapon -s | status na temat dysków na których działają nasze pliki wymiany |
Jeśli wcześniej mieliścmy plik wymiany ustawiony na 128MB i zram również na 128MB to teraz nasz SWAP będzie liczył łącznie 256MB, co możemy zweryfikować poniższym poleceniem:
free -h
W pierwszej kolejności jak już wspomniałem dane będą zapisywane do zram i tam kompresowane !
Aby zram był uruchamiany przy starcie, wpisujemy do /etc/rc.local poniższą linię przed exit 0 zastępując ścieżkę do własnej lokalizacji ze skryptem:
sh /root/zram.sh
Oczywiście musimy ustawić plik na wykonywalny:
chmod +x zram.sh
+ Optymalizacja SWAP
Wielkość dysku przeznaczonego na plik wymiany SWAP a także kwestia czy ma być włączony czy wyłączony zależy od naszych potrzeb a w zasadzie od aplikacji z których korzystamy. Sami musimy zdecydować jaką optymalną wartość ustawić dla SWAP czy też całkowicie go wyłączyć. Jeśli już jesteśmy zmuszeni do pracy z plikiem wymiany to należy go odciążyć za pośrednictwem zram – dzięki czemu zmniejszy się ilość cykli zapisu na naszej karcie pamięci / SSD. Plik wymiany może być na odrębnej dedykowanej partycji ( np. Ubuntu Mate ) lub w pliku umieszczonym na partycji systemowej ( Raspbian ).
Najlepiej do bieżącego monitorowania stanu naszej pamięci wykorzystać polecenie top lub htop
top
Ogólne zalecenia:
- Jeśli mamy dużo wolnego RAMU ( powyżej 300-400MB ) wyłączamy SWAP
- Jeśli SWAP jest wykorzystywany w niewielkim stopniu i sporadycznie to ZRAM nie jest polecany, należy odpowiednio ustawić wielkość pamięci SWAP – nie więcej jak 100MB
- Jeśli zarówno RAM jak i SWAP jest poważnie obciążony zalecana jest aktywowanie ZRAM i SWAP z odpowiednimi ustawieniami w zależności od potrzeb
Aby wyłączyć całkowicie plik wymiany SWAP wpisujemy poniższe polecenie:
dphys-swapfile swapoff
lub
swapoff -a
Jeśli SWAP jest obsługiwany przez dphys-swapfile, możemy go odinstalować jako usługa uruchamiana podczas startu systemu:
dphys-swapfile uninstall
Poniżej opcje sterujące dla dphys-swapfile:
/sbib/dphys-swapfile {setup|swapon|swapoff|uninstall}
Sprawdzamy jeszcze na wszelki wypadek czy w /etc/fstab jest wpis z partycją SWAP, jeśli tak to należy ją zahaszkować lub usunąć.
W Ubuntu Mate dla Raspberry SWAP jest wyłączony domyślnie – nie jest nawet zainstalowany pakiet odpowiedzialny za SWAP: dphys-swapfile.
Jeśli chodzi o zmianę wielkości SWAP w przypadku Raspbiana zmieniamy opcję w pliku: /etc/dphys-swapfile
CONF_SWAPSIZE=100
Restart usługi odpowiedzialnej za plik wymiany:
/etc/init.d/dphys-swapfile stop /etc/init.d/dphys-swapfile start
Jeśli w Ubuntu Mate mamy włączony SWAP to jest on umieszczony na dedykowanej partycji więc w tym przypadku zmieniamy jej wielkość za pomocą Gparted !
+ Zmniejszenie ilości cyklów zapisu
Aby ograniczyć zużycie karty SD czy też dysku SSD należy zminimalizować ilość cyklów zapisu danych na dysku. Ewentualnie część danych, które nie są krytyczne dla działania systemu możemy przenieść do pamięci RAM / SWAP wykorzystując tmpfs. Opcja z wykorzystanie tmpfs jest najbardziej optymalna jeśli wykorzystamy Zram w kontekście kompresji danych dla partycji SWAP. Tak więc w pierwszej kolejności jeśli pamięć RAM zostanie zużyta to dane będą zapisywane w partycji SWAP ( Zram ) a jeśli ta zostanie zapełniona to dane będą przechowywane na zwykłej partycji/pliku SWAP ( jeśli SWAP jest włączony ).
Dodajemy atrybut noatime do pliku: /etc/fstab, dzięki czemu nie będą zapisywane informacje o ostatnim dostępnie do plików. Przykład z zamountowanymi partycjami z pliku fstab:
proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mmcblk0p2 / ext4 errors=remount-ro,noatime,nodiratime 0 1
Następnie wydajemy polecenie:
mount -a
Po restarcie sprawdzamy czy partycje zostały zamountowane z właściwymi opcjami:
cat /proc/mounts
lub df ( disk free ):
df
Warto też dodać do fstab możliwość zapisywania plików tmp i logów do RAM/SWAP ( tmpfs ):
# tmpfs /tmp tmpfs defaults,noatime,nosuid,size=64M 0 0 tmpfs /var/tmp tmpfs defaults,noatime,nosuid,size=64M 0 0 # tmpfs /var/run tmpfs defaults,noatime,nosuid,mode=0777=2M 0 0 tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0777,size=4M 0 0
Następnie:
mount -a
W przypadku katalogu /var/run w wielu dystrybucjach lokalizacja ta jest linkowana do /run np:
/var/run -> /run /var/lock -> /run/lock /dev/shm -> /run/shm /tmp -> /run/tmp
Kilka wątpliwośći przed nadmiernym korzystaniem z tmpfs: Uwagi o tmpfs
+ Integralność danych na karcie
Włączamy sprawdzanie dysku co 3 restarty:
tune2fs -c 3 /dev/mmcblkp02
Ustawiamy autokorektę w pliku /etc/default/rcS:
FSCKFIX=yes
+ Zastąpienie Rsyslogd na Syslogd
Syslogd jest mniej wymagający jeśli chodzi o zużycie CPU i RAM. Odinstalowywujemy rsyslogd:
apt-get -y remove --purge rsyslog
Instalujemy syslogd:
apt-get -y install inetutils-syslogd
Konfiguracja syslog:
/etc/syslog.conf
Konfiguracja logrotate:
/etc/logrotate.d/inetutils-syslogd
+ Przeniesienie systemu na dysk USB ( HDD lub SSD )
Bootowanie w przypadku Raspberry możliwe jest tylko z karty pamięci. Oczywiście nic nie stoi na przeszkodzie aby po wgraniu bootloadera podmountować zewnętrzny dysk i z niego wczytywać sam OS.
Praca systemu na karcie pamięci nie jest zbyt efektywna z uwagi na ograniczoną ilość IOPS. Na kartach pamięci tych szybszych mamy dość sensowne transfery odczyt/zapis jednak w przypadku odczytu rozproszonego taki transfer drastycznie spada.
Możemy podłączyć dysk USB i w tej sytuacji ograniczeniem transferu danych będzie magistrala USB 2.0 ( oficjalnie max. 480Mb/s ). Realne prędkości to najczęściej połowa tego wyniku. Na transfer ma także wpływ jakość i długość kabla USB.
Na dysku należy mieć utworzoną partycję linuksową a na karcie pamięci z systemem należy zmienić ścieżkę w pliku:
cmdline.txt
Zmieniamy wpis z root=/dev/mmcblk0p2
na ściężkę do naszego dysku USB:
root=/dev/sda2
+ Podręcanie CPU / GPU / Pamięć
Do tych opcji należy podchodzić wyjątkowo ostrożnie. Opcje odpowiedzialne za podkręcanie podzespółów Malinki znajdują się w pliku: /boot/config.txt
arm_freq=1000 sdram_freq=500 core_freq=500 over_voltage=2 hdmi_drive=2 gpu_mem=128 # Większa wydajność w 3D jeśli GPU jest wykorzystywany #h264_freq=750 #isp_freq=750 #v3d_freq=750 # Większa szybkość ( dynamiczne taktowanie CPU ): może spowodować utratę gwarancji ! #force_turbo=1
Słowa kluczowe: optymalizacja Raspberry, linux, ubuntu, raspbian, debian, archlinux, orange pi, banana pi, mini komputerki, jednopłytowe, optymalizacja zapisu ssd, zapis na kartach pamięci, ograniczenie zapisu na kartach pamięci i SSD, bootowanie Raspberry z dysku USB, ramdysk, podkręcanie CPU, GPU, Raspberry Pi 2, zero