Używane wersje kernela na 25 października 2018.

Sprawdziłem z ciekawości, jakie wersje kernela używają wielcy świata informatyki. Wybrałem preferowane obrazy u trzech dostawców. Amazon ma własny system, Google przesiadło się konsekwentnie na Debian'a, a korporacja winzgrozy wybrała Ubuntu.


AWS Cloud:
Preferowany system: Amazon Linux 2 AMI
[ec2-user@ip-xx-xxx-xxx-xx ~]$ uname -a
Linux ip-xx-xxx-xxx-xx.eu-west-1.compute.internal 4.14.72-73.55.amzn2.x86_64 #1 SMP Thu Sep 27 23:37:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux


Google Cloud:
Preferowany system: Linux instance-1 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u6 (2018-10-08) x86_64
rjackiewicz@instance-1:~$ uname -a
Linux instance-1 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u6 (2018-10-08) x86_64 GNU/Linux


Azure:
Preferowany system: Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-1023-azure x86_64)
rjackiewicz@tescik:~$ uname -a
Linux tescik 4.15.0-1023-azure #24-Ubuntu SMP Tue Aug 28 17:35:08
(Mówi się, że Ubuntu to staroafrykańskie słowo oznaczające "nie umiem zainstalować debiana")


Chmurę IBM i Oracle sobie tym razem darowałem.

Jednocześnie na www.kernel.org:
mainline: 4.19
stable: 4.18.16
longterm: zapowiadane jest 4.19

***

Jeszcze dla potomności Freebsd 11 z AWS Martetplace:
FreeBSD freebsd 11.2-RELEASE FreeBSD 11.2-RELEASE #0 r335510: Fri Jun 22 04:32:14 UTC 2018



********

Więcej informacji:
Informatyka, FreeBSD, Debian


***

Inne wpisy:



Update: 2018.10.27
Create: 2018.10.27


Generator liczb pseudolosowych

W niektórych zastosowaniach potrzeby jest wydajny generator liczb losowych, chociaż zazwyczaj wystarczy po prostu wydajny generator liczb pseudolosowych (PRNGs). Dotyczy to np. instalacji serwerów i nod'ów Oracle WebLogic. Ponieważ oryginalny generator liczb pseudolosowych zawarty w jądrze Linux'a jest mało wydajny dokumentacja Oracle poleca tu następujące rozwiązanie: https://docs.oracle.com/cd/E13209_01/wlcp/wlss30/configwlss/jvmrand.html
Jak jest wydajność standardowego generatora liczb pseudolosowych zawartego w jądrze Linux'a uruchomionego na zwirtualizowanym serwerze? Jak duży jest to problem? Na poniższym screenie można zobaczyć wynik zapytania o milion bajtów pseudolosowych do urządzenia /dev/random. Po prawie 10 minutach przerwałem tą operację uzyskawszy 232 bajty.
Tak, przez 10 minut otrzymałem 232 liczby pseudolosowe o wielkości jednego bajta, gdyż do ich generowania /dev/random wykorzystuje zasób entropii o wielkości 4096 bitów. Gdy ta pula zostanie wyczerpana pobieranie danych z /dev/random zatrzymuje się. Wielkość tego bufora jest ustawiona w /drivers/char/random.c:
#define INPUT_POOL_WORDS 128
#define OUTPUT_POOL_WORDS 32
(INPUT_POOL_WORDS * OUTPUT_POOL_WORDS  ---> 128 * 32 = 4096 b).
W nowszych kernelach wielkość tego buforu jest kontrolowana przez /proc, a nadal pozostaje problem zapełnienia tego bufora entropii - wynika to z deterministycznego charakteru działania komputera, co przecież normalnie jest bardzo pożądane. Uzyskanie obliczeniowo bezpiecznych danych wymaga około 256 bitów entropii (32 bajty), a często wystarczy połowa tego.
Mimo tak marnej wydajności standardowego generatora rozwiązanie proponowane zarówno przez firmę Oracle, jak i przez inne źródła internetowe, a polegające na użyciu urządzenia /dev/urandom (od unblocking), jest według mnie bardzo niewskazane. Generator skojarzony z /dev/random daje liczby pseudolosowe o wysokiej odporności na przewidywalność kolejnych danych. Jednak ziarna używane do ich generacji nie są pozyskiwane ze źródeł o dużej wydajności, a jest to szczególnie trudne w środowisku zwirtualizowanym.
Więcej o "/dev/random":
man 4 random
Użycie urządzenia /dev/urandom (używającego funkcji skrótu na danych z pobranych /dev/random) jako obejście tego problemu daje liczby pseudolosowe, o nieakceptowalnej przewidywalności przez wiele aplikacji, jak np.: np. OpenSSL, PGP i GnuPG. Aplikacje te polegają na pobraniu "soli" (ang. seed) z /dev/random i na tej podstawie generują pseudolosowe ciągi bitów. Mimo tego to właśnie /dev/urandom jest preferowanym urządzeniem w Linuksie. Z kolei w FreeBSD (OS X) urządzenie /dev/urandom jest dokładnie tym samym urządzeniem, co /dev/urandom.
Warto zaznaczyć, że /dev/urandom jest nieblokujący i poda zawsze tyle danych ile zostanie zażądane. Urządzenie to używa pseudolosowy generator liczb Yarrow. Gdy bufor entropii zostanie wyczerpany dane są generowane w cyklu, tak więc po wygenerowaniu 2^160 ~ = 1,5x10^48 bitów dane zaczną się powtarzać. Dla przykładu 1 ZB ~= 1.2x10^21 (zettabajt).

Warto jeszcze zaznaczyć, że obsługa urządzeń pseudolosowych i pozwalających uzyskać dane dla bufora entropii zmienia się wraz z wersjami kernela.
Np. na lewym schemacie widać obsługę /dev/random i /dev/urandom przez kernele przed wersją 4.8, a na prawym od wersji 4.8:





Cześć praktyczna:
Na trzech serwerach: bibi, jenna i sasha bez modyfikacji generatora liczb pseudolowosych z kernela 3.10.0-327.10.1.el7.x86_64, pula entropii wynosi odpowiednio:
Gdy zaczniemy pobierać dane z /dev/random to uzyskamy na tych zwirtualizowanych serwerach tylko kilkanaście bajtów i wyczerpiemy zawartość bufora entropii:
Serwer sasha:
Serwer bibi:
Serwer jenna:

W takiej sytuacji standardowym postępowaniem jest instalacja "rng-tools":
yum install rng-tools
service rngd start
service rngd status
Teraz możemy wykonać test, jak na poniższym screenie:
Niestety, nie sprawdzi się to w niektórych sytuacjach. Głównym problemem jest wirtualizacja, gdzie powyższe polecenie nie zakończy się w sensownym czasie. Rozwiązań może być kilka. Przykładowo dla VMware ESXi należy ustawić monitor_control.virtual_rdtsc = "FALSE". Innym rozwiązaniem jest użycie kernela w wersji od 3.5 (z obsługa RDRAND). Gdy nie używamy VMware, lub wymaganego kernela w naszej dystrybucji, możemy zainstalować program "haveged" (http://www.issihosts.com/haveged/):
#yum install epel-release
yum install haveged
systemctl enable haveged
systemctl start haveged
systemctl status haveged

Po instalacji "haveged" i sprawdzeniu buforów entropi na serwerach bibi, sasha i jenna, oraz wykonaniu "cat /dev/random | rngtest -c 1000", uzyskamy poniższe wyniki:

Przydatne komendy do testów:
cat /dev/random
cat /dev/urandom
#
time cat /dev/random | rngtest -c 1000
time cat /dev/urandom | rngtest -c 1000
#
cat /proc/sys/kernel/random/entropy_avail
watch -n 1 cat /proc/sys/kernel/random/entropy_avail

Teraz pobieranie danych z /dev/rand nie jest spowolnione, a poniżej widać wielkość bufora entropii w trakcie takiego pobierania danych na serwerze bibi:

Wobec tego w większości systemów nie bedzie potrzeby modyfikacji źródła danych pseudolosowych dla WebLogic'a:

Możemy nawet sprawdzić z jaką szybkością będziemy mogli pobrać 1000000 bajtów z /dev/random i /dev/urandom
dd if=/dev/random of=/dev/null count=1000000 bs=1




Gdy systemy i wirtualizacja stosowana przez klienta uniemożliwia zastosowanie wydajnych algorytmów pseudolosowych (PRNGs), lub gdy klient wymaga prawdziwego generatora liczb losowych (TRNGs) w zwirtualizowanych systemach, można wykonać następująca instalację rozproszoną.
W serwerowni klienta, lub innej, instalujemy serwer przeznaczony do generowania licz losowych. Powinien to być serwer bez wirtualizacji, gdy opieramy się o dane zbierane z jego podzespołów, lub serwer zwirtualizowany, ale z dostępem do portów USB (dla USB 1.1 mamy znaczące ograniczenie wydajności). Taki centralny serwer można też wykonać jako serwer zbierający dane potrzebne do uzyskania wysokiej jakości generowanych liczb losowych z rozproszonych agentów. Jako agentów do takiego systemu można użyć wielu uwierzytelnionych komputerów połączonych szyfrowaną siecią. Dane mogą być generowane na podstawie np.:
1) Z kart dźwiękowych.
2) Modułów TPM.
3) Pamięci cache procesora.
4) Nowe procesory mają odpowiednie instrukcje.
Losowe liczby generowane z wielu agentów mogą następnie być dystrybuowane, również szyfrowanymi i uwierzytelnionymi kanałami, do farm serwerów i nod'ów obliczeniowych. Dzięki takiemu rozwiązaniu można mieć centralne źródło liczb losowych. Łatwiej jest je wyposażyć w odpowiedniej jakości sprzętowy generator liczb losowych, łatwiej dbać o oprogramowanie i bezpieczeństwo systemu.
 
Można też użyć dedykowanego sprzętu opartego np. o takie zjawiska fizyczne jak np.:
  • Szum termiczny - dla idealnego opornika jest to szum biały. Opisuje to wzór Johnsona-Nyquista na wartość średniokwadratową napięcia szumu termicznego na zaciskach opornika, który jest zasadniczo zgodny z jednowymiarową wersją prawa Plancka promieniowania ciała doskonale czarnego (promieniowanie elektromagnetyczne ciała czarnego w jednym wymiarze).
  • Szum wahań termodynamicznych naładowania kondensatora (detekcja np. w obwodzie RC).
  • Efekt fotoelektryczny.
  • Szum złącza P-N.
Można również oprzeć generator liczb losowych o szerokopasmowe zakłócenia EM i RFI , szum promieniowania kosmicznego (np.: Drogi Mlecznej), szum kwantyzacji, losowość niezainicjalizowanej pamięci RAM. Jak widać starano się wykorzystać wszelkie możliwości, a czym tańsze i prostsze w implementacji tym lepiej. Poniżej kilka przykładów sprzętowych implementacji generatorów liczb losowych:





********

Więcej informacji:
Informatyka, FreeBSD, Debian


***

Inne wpisy:



Update: 2018.07.17
Create: 2018.07.17

Zestawienie kart graficznych - CUDA

Współcześnie (2018.07.05) do testów używam układ NVS5200m, o dosyć skromnych możliwościach (renderuje 400 klatek mniej od obecnie top'owego fermi 2.1)
http://www.gpuzoo.com/GPU-NVIDIA/Quadro_NVS_5200M.html

NVS-5200M (Fermi)
96 cores, 1 GHz
1 GB, 14 GB/s, 64 b.
CUDA compute capability 2.1

GeForce GTX 750 Ti (Maxwell)
640 cores, 1 GHz
2 GB, 86 GB/s, 128 b.
CUDA compute capability: 5.0

GTX 660 TI (Kepler, GK104)
1344 cores, 1 GHz
2 GB, 144 GB/s, 192 b.
CUDA compute capability: 3.0
2,5 TFLOPS Single-precision floating point performance

GeForce GTX 960 (Maxwell)
1024 cores, 1,1 GHz
2 GB, 86 GB/s, 128 b.
CUDA compute capability: 5.2

GeForce GTX 980 (Maxwell)
2048 cores, 1,1 GHz
4 GB, 224 GB/s, 256 b.
CUDA compute capability: 5.2

GeForce GTX 1050 (Pascal)
640 cores, 1,3 GHz (2 GB)
768 cores, 1,3 GHz (4 GB)
112 GB/s, 128 b.
CUDA compute capability: 6.1

GeForce GTX 1060 (Pascal)
1152 cores, 1,5 GHz (3 GB)
1280 cores, 1,5 GHz (6 GB)
192 GB/s, 192 b.
CUDA compute capability: 6.1
4 TFLOP/s Single-precision floating point performance

GeForce GTX 1070 (Pascal)
1920 cores, 1,5GHz
8 GB, 256 GB/s, 256 b.
CUDA compute capability: 6.1
6 TFLOP/s Single-precision floating point performance

GeForce GTX 1080 (Pascal)
2560 cores, 1,6 GHz
8 GB, 320 GB/s, 256 b.
CUDA compute capability: 6.1
9 TFLOPS

Tesla K80 (2 x GK210)(Kepler)
4992 cores (2 x 2496), 0,6 GHz
24 GB ECC (2 x 12 GB), 2 x 240 GB/s, 384 b.  - GDDR5
CUDA compute capability: 3.7
5,6 TFLOPS (taktowanie standardowe), 8,74 TFLOPS (taktowanie Boost) - Single-precision floating point performance
Wydajność obliczeń o podwójnej precyzji do 2,91 Teraflops z wykorzystaniem technologii NVIDIA GPU Boost
Wydajność obliczeń o pojedynczej precyzji do 8,74 Teraflops z wykorzystaniem technologii NVIDIA GPU Boost

Tesla P100 (Pascal)
3584 cores
16 GB 732 GB/s
12 GB 549 GB/s
9,3 TFLOPS Single-precision floating point performance (PCIe)
10,6 TFLOPS Single-precision floating point performance (NVLink)

Titan X (Pascal GP102)
3584 cores, 1,4 GHz    - 1531 MHz w trybie GPU Boost 3.0, 56-procesorów strumieniujących, 224-TMU i 96-ROP.
12 GB, 480 GB/s, 384 b.  - GDDR5X - jest to jedna z najszybszych technologii pamięci na świecie.
CUDA compute capability: 6.1
11 TFLOPS Single-precision floating point performance


Dla porównania dane procesora ogólnego przeznaczenia:
i7-3740QM CPU @ 2.70GHz (Ivy Bridge)
Max. memory bandwidth: 25.6 GB/s
0,172 TFLOPS



Efektywność energetyczna: 

T10 GPU wydany w 2010 roku: 2 GFLOPS/W
Fermi GPU wydany w 2010 roku: 3 GFLOPS/W
Kepler GPU wydany w 2012 roku: 25 razy wydajniejszy od Fermi 6 GFLOPS/W
Maxwell GPU wydany w 2014 roku: 35 razy wydajniejszy od Kepler 16 GFLOPS/W
Pascal GPU wydany w 2016 roku: 10 razy wydajniejszy od Maxwell.


********

Więcej informacji:
Informatyka, FreeBSD, Debian


***

Inne wpisy:



Update: 2018.07.17
Create: 2018.07.17