Archiwa tagu: Go

Optymalizacja Go dla AIX: GOPPC64 i Cross-Compile

Jak zapewne wiecie, Go został zaprojektowany tak, żeby budować binaria specyficzne dla konkretnej architektury i systemu operacyjnego. Te specyficzne dla architektury i OS binaria nazywamy targetem. Możliwość cross-compile (kompilacji krzyżowej) to jedna z najfajniejszych funkcji Go – można na przykład użyć GOARCH=ppc64 GOOS=aix go build, żeby na Linuxie czy Windowsie zbudować aplikację dla systemu AIX działającego na procesorach Power. Oczywiście też nic nie stoi na przeszkodzie, żeby skompilować program bezpośrednio na AIX.

Jest jednak jeden dodatkowy trik, który bierze pod uwagę wersję architektury i optymalizuje wybór kodu ASM (assembler), używanego podczas budowania. 😉

PowerPC na AIX i zmienna GOPPC64

Żeby używać architektury Power ppc64 dla AIX z konkretnym targetem procesora, możesz skorzystać ze zmiennej GOPPC64. Oto dostępne opcje:

  • power10 – działa tylko z Power 10
  • power9 – działa z Power 9 i Power 10
  • power8 (domyślna) – działa z wersjami 8, 9 i 10

Przykładowo:

GOARCH=ppc64 GOOS=aix GOPPC64=power9 go build

Dlaczego to ma sens w środowisku AIX?
Systemy AIX często działają na konkretnych, znanych konfiguracjach serwerowych IBM. Jeśli wiesz, że Twoja aplikacja będzie działać tylko na nowszych procesorach Power (np. power9 lub power10), możesz wykorzystać dodatkowe instrukcje procesora niedostępne w starszych wersjach. Go automatycznie wybierze zoptymalizowany kod assemblerowy dla danej wersji.

Specyfika środowiska AIX

AIX to system, który często działa latami na tych samych maszynach, więc optymalizacja pod konkretny procesor może mieć długoterminowy sens. W przeciwieństwie do środowisk chmurowych, gdzie nie wiesz na czym będzie działać Twoja aplikacja, w AIX zazwyczaj masz pełną kontrolę i wiedzę o sprzęcie.

Co oczywiste, jeśli masz farmy serwerów z różnymi generacjami Power, lepiej zostać przy domyślnym ustawieniu. 🏭

Czy to rzeczywiście coś zmienia?

W typowych aplikacjach biznesowych różnica może być niewielka, ale przy:

  • Intensywnych obliczeniach matematycznych (typowe dla środowisk AIX)
  • Przetwarzaniu dużych zbiorów danych
  • Aplikacjach real-time

różnica może być zauważalna. Jak zawsze z optymalizacjami – najpierw zmierz, potem optymalizuj. 🔧

Bibliografia

Pro tip dla adminów AIX: Możesz sprawdzić wersję swojego procesora Power używając komendy prtconf | grep -i processor. Dzięki temu będziesz wiedzieć, jaką wartość GOPPC64 możesz bezpiecznie użyć.

Go / Golang – instalacja na Centos 7

Red Hat Enterprise Edition, a co za tym idzie również Centos są znane z dość konserwatywnego podejścia do wersji dostępnych pakietów.
Kiedy piszę tę notatkę, w oficjalnym repozytorium CentOS dostępny Go dostępne jest w wersji 1.8.3, natomiast najnowszy stabilny release Go to wersja 1.10.
Oczywiście instalacja ze źródeł, czy też z tar.gz z binarkami to żaden problem, ale nie po to wymyślono pakiety, żeby wszystko robić na około. Są na szczęście 'dobrzy ludzie’, którzy pomyśleli o zrobieniu repozytorium z aktualnymi paczkami, można je znaleźć pod adresem: https://go-repo.io/

Ściągawka do instalacji repo:

(root)

rpm --import https://mirror.go-repo.io/centos/RPM-GPG-KEY-GO-REPO
curl -s https://mirror.go-repo.io/centos/go-repo.repo | tee /etc/yum.repos.d/go-repo.repo
yum install golang

Ściągawka do konfiguracji środowiska:
(user do kodowania)

mkdir -p ~/go/{bin,pkg,src}
echo 'export GOPATH="$HOME/go"' >> ~/.bashrc
echo 'export PATH="$PATH:${GOPATH//://bin:}/bin"' >> ~/.bashrc