SlideShare una empresa de Scribd logo
1 de 44
Descargar para leer sin conexión
Matteo Baccan
Succo di lampone: come ottimizzare JAVA e PHP
su un’architettura Raspberry Pi Cluster
matteo@baccan.it
Chi sono?
Matteo Baccan

JUG Novara, PUG Novara

Matteo Baccan
Divulgatore informatico, giornalista per
riviste tecniche nazionali oltre 700 articoli
per :Dev, Login, Computer Programming,
Mokabyte. Relatore tecnico ad eventi di
programmazione: Borland Forum 2000,
Webbit 2004, JIP day 2005, Javaday
(2006,2007,2010) PHPDay (2008, 2010),
CONFSL 2010, WebTech 2010,
Codemotin (2011,2012,2013). Autore di
Corso di C# ISBN 8881500167. Autore di
JobCrawler e HTML2POP3 (Oltre
900.000 download su SourceForge)
Programma
Matteo Baccan

JUG Novara, PUG Novara

Il mio motto

la felicità è vera solo se condivisa
so che è una frase di “Into the Wild”
Programma
Matteo Baccan

JUG Novara, PUG Novara

Cosa vedremo
Cos’è Raspberry Pi
● Cosa ci possiamo fare
● Alcune ottimizzazioni del sistema di base
● PHP su Raspberry Pi
● Java su Raspberry Pi
● Alternative per lo sviluppo
● Emulazione
●
Cos’è Raspberry Pi
Matteo Baccan

JUG Novara, PUG Novara

Tratto da : http://it.wikipedia.org/wiki/Raspberry_Pi
Il Raspberry Pi è un single-board computer (SBC) sviluppato nel Regno Unito dalla
Raspberry Pi Foundation.
Il suo lancio al pubblico è avvenuto alla fine del mese di febbraio 2012.
L'idea di base è la realizzazione di un dispositivo economico, concepito per stimolare
l'insegnamento di base dell'informatica e della programmazione nelle scuole
Il progetto ruota attorno a un System-on-a-chip (SoC) Broadcom BCM2835,
che incorpora un processore ARM1176JZF-S a 700 MHz, una GPU VideoCore IV,
e 256 o 512 Megabyte di memoria.
Il progetto non prevede né hard disk né una unità a stato solido, affidandosi invece a
una
scheda SD per il boot e per la memoria non volatile.
La scheda è stata progettata per ospitare sistemi operativi basati su un kernel Linux
o RISC OS.
Cosa ci possiamo fare
Matteo Baccan

per chi non l'avesse mai visto

JUG Novara, PUG Novara
Cosa installare
Matteo Baccan

JUG Novara, PUG Novara

Il punto di partenza è sicuramente NOOBS (attualmente v 1.3.2)
http://www.raspberrypi.org/downloads
Cosa installare
Matteo Baccan

JUG Novara, PUG Novara

All’interno di NOOBS (New Out Of Box Software) è possibile trovare una serie di
sistemi operativi installabili
Raspbian : Il porting di Debian 7 “Wheezy”, ottimizzato per Raspberry Pi
(consigliata)
Pidora: Pidora is a Fedora Remix optimized for the Raspberry Pi
Arch: An Arch Linux port for ARM devices
OpenELEC: is a fast and userfriendly XBMC Mediacenter distribution.
RaspBMC: An XBMC media center distribution for Raspberry Pi
RISC OS: is a very fast and compact system
Raspbian
Matteo Baccan

JUG Novara, PUG Novara

Oggi parleremo di Raspbian

È una distribuzione pensata per essere “general purpose”, con un
utilizzo client
Non esiste una versione server ufficiale di Raspbian
Vediamo insieme come costruirla.
Iniziamo a spremere il nostro lampone
Raspbian Server Edition
Matteo Baccan

JUG Novara, PUG Novara

Per fortuna qualcuno si è posto il problema di non avere una
distribuzione ottimizzata per una configurazione server e ha realizzato
Raspbian Server Edition 2.5
http://sirlagz.net/2013/07/19/raspbian-server-edition-2-5/
In realtà è una Raspbian basata su Debian 7 Wheezy portata a Debian 8
Jessie, con la rimozione di una serie di pacchetti “inutili” a livello
server.
Parte dal concetto che: un “purista” considera peccaminoso l’utilizzo
di una GUI su un server, viene quindi rimosso LXDE e tutti i relativi
pacchetti, più una serie di pacchetti non necessari su un server
Raspbian Server Edition
Matteo Baccan

JUG Novara, PUG Novara

Non dobbiamo però essere ottimisti: la sola rimozione dei pacchetti
inutili non basta a realizzare una versione server di Raspberry Pi.
Vediamo quali altre tecniche ci permettono di migliorare i 2 aspetti
che possono cambiare notevolmente le prestazioni di un Raspberry Pi

velocità
memoria
Velocità: Overclock guidato
Matteo Baccan

JUG Novara, PUG Novara

Chi non ha mai provato ad “overcloccare” il proprio computer?
Con Raspberry Pi l’overclock è ammesso e di sistema.
Tramite l’utility di configurazione

: sudo raspi-config
Velocità: Overclock manuale
Matteo Baccan

JUG Novara, PUG Novara

Per chi volesse provare manualmente, basta modificare direttamente il file

sudo nano /boot/config.txt
Sul forum Raspberry Pi sono indicate altre configurazioni possibili, che possono
farci arrivare alla frequenza di 1150MHz.
Per info http://elinux.org/RPiconfig
arm_freq
800
900
900
930
1000

gpu_freq
275
350

Manualmente
1050
1150

core_freq

450
500

500

sdram_freq

over_voltage

500
450
500
500

6

600

6
8
Velocità: Overclock manuale
Matteo Baccan

JUG Novara, PUG Novara

Ci sono comunque anche voci di overclock a 1200 MHz e per chi volesse provare,
sono disponibili sul mercato dissipatori a 7 euro, in grado di diminuire di qualche
grado la temperatura del processore.
Oppure se avete ancora in cantina dei vecchi PC .. staccategli la ventolina, costerà
ancora meno :)
Memoria: Condivisione memoria CPU/GPU
Matteo Baccan

JUG Novara, PUG Novara

Cambio allocazione della memoria CPU/GPU
Di default Raspberry Pi parte con 64MB di ram per la GPU. Installando un sistema
server possiamo diminuire questa memoria a 16MB
Possiamo modifiare
/boot/config.txt
gpu_mem=16
o usare raspi-config
Memoria: Sessioni terminale inutili
Matteo Baccan

JUG Novara, PUG Novara

Ottimizzazione servizi esistenti
sudo nano /etc/inittab

Al netto delle rimozioni fatte su Raspbian, possiamo ancora ottimizzare
diminuendo i processi per le connessioni terminale, passando dalle 6
(default) a 2 .
1:2345:respawn:/sbin/getty --noclear 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6
Consuntivo PRE/POST ottimizzazioni
Matteo Baccan

JUG Novara, PUG Novara

Aumento velocità di elaborazione passando da 700 a 1000 MHz = 50%
Aumento di memoria = 60%
pi@piserver ~ $ free
total

used

free

shared

buffers

cached

497504

58816

438688

0

15588

26976

-/+ buffers/cache:

16252

481252

0

102396

total

used

free

shared

buffers

cached

448736

175880

272856

0

18368

137004

-/+ buffers/cache:

20508

428228

0

102396

Mem:

Swap:

102396

pi@pinodo2 ~ $ free

Mem:

Swap:

102396
Per chi vuole osare
Matteo Baccan

JUG Novara, PUG Novara

Possiamo spremere ancora di più Raspberry Pi
●

staccando alcuni degli ultimi servizi attivi (p.e. rsyslog)

●

passando ad 1 sessione terminale

●

●

aumentando l’overclock e trovando un modo affidabile per
raffreddare il processore (in passato ho utilizzato un ventilatore)
acquistare delle SD più performanti (classe 10)

Ricordiamoci che l’overclock esagerato potrebbe rendere le SD utilizzate
dal sistema operativo inutilizzabili.
Se questo non vi spaventa e avete già bruciato qualche processore (so
che per qualcuno che legge queste slide non sarebbe la prima volta)
allora potete osare.
Fino alla configurazione indicata, funziona tutto, oltre, basta provare :)
PHP
Matteo Baccan

JUG Novara, PUG Novara
Stack LAMP
Matteo Baccan

JUG Novara, PUG Novara

Installazione stack LAMP
Ora che abbiamo ottimizzato Raspberry Pi, possiamo passare allo stack
LAMP
Di default, lo stack LAMP non è installato su Raspbian.
Essendo un sistema Linux, l’installazione dello stack LAMP è identica a
quella che si farebbe su un qualsiasi server Debian non Raspberry Pi
Stack LAMP
Matteo Baccan

JUG Novara, PUG Novara

Installiamo lo stack LAMP
sudo apt-get install apache2 php5 mysql-server 
libapache2-mod-php5 php5-mysql php5-fpm 
mysql-client phpmyadmin

Linux
Apache
MySQL
PHP

Wheezy
2.2.22
5.5.31
5.4.4

Jessie
2.4.6
5.5.33
5.5.5 (bi-zona)

Nessuno ci vieta di installare versioni diverse
Alternative ad Apache
Matteo Baccan

sudo apt-get install nginx

JUG Novara, PUG Novara

NGINX
MONKEY

sudo nano /etc/apt/sources.list
deb http://packages.monkey-project.com/primates_pi primates_pi main
apt-get update

sudo apt-get install monkey
monkey-liana
monkey-logger
monkey-dirlisting
monkey-cgi
monkey-fastcgi
monkey-mandril
monkey-cheetah
Monkey-auth

LIGHTTPD

sudo apt-get install lighttpd
Stress test e Bilanciatore
Matteo Baccan

JUG Novara, PUG Novara

Per valutare le prestazioni del sistema sono necessari 2 tool
●

Programma di Stress Test. Nel mio caso ho installato e compilato siege3.0.5 su Cygwin (lo so sono un programmatore Windows)

wget http://www.joedog.org/pub/siege/siege-3.0.5.tar.gz
●

Un bilanciatore di carico, in questo caso l’ho utilizzato direttamente sul
nodo Master del cluster di test

wget http://haproxy.1wt.eu/download/1.5/src/devel/haproxy-1.5-dev19.tar.gz
make TARGET=linux2628 USE_ZLIB=1

Ho scelto di non utilizzare haproxy 1.4 presente in Raspbian Pi, dato che
non è presente una importante feature : la compressione GZIP
Ambiente di test
Matteo Baccan

JUG Novara, PUG Novara

Per i test ho optato per 2 file diversi, in modo da verificare le
ottimizzazioni possibili in caso di risorse testuali (html, css, js, etc)
●
●

<?php phpinfo() ?>
Il sorgente html di phpinfo

Ho volutamente evitato di parlare di risorse non testuali già
compresse (immagini, filmati) in quanto occorrerebbe una trattazione
apposita, e la realizzazione di un server specializzato nel delivery di
risorse statiche (la classica installazione CDN)
I test sono stati fatti tutti mettendo in concorrenza 5 processi sullo
stesso server, dato che stiamo pensando ad un ambiente web di test o
dedicato a piccole aziende, dove non vengono superati i 5000 unique
user al giorno
Ambiente di test
Matteo Baccan

JUG Novara, PUG Novara

Nodo server: haproxy

LAMP a default

LAMP modificato
Nodo2 a default: GZIP compression
Matteo Baccan

JUG Novara, PUG Novara

780 pagine per 6.81MB di traffico in 1 minuto
$ siege -q -b -t 1m -c5 http://192.168.2.22/phpinfo.php -m pinodo2 -lapache.log
Lifting the server siege...
Transactions:
Availability:
Elapsed time:
Data transferred:
Response time:
Transaction rate:
Throughput:
Concurrency:
Successful transactions:
Failed transactions:
Longest transaction:
Shortest transaction:
top - 01:27:59 up
Tasks: 72 total,
%Cpu(s): 92,6 us,
KiB Mem:
448736
KiB Swap:
102396

done.
780
100.00
59.93
6.81
0.38
13.01
0.11
4.99
780
0
1.02
0.19

hits
%
secs
MB
secs
trans/sec
MB/sec

3:20, 1 user, load average: 3,66, 1,84, 0,85
7 running, 65 sleeping,
0 stopped,
0 zombie
5,2 sy, 0,0 ni, 0,0 id, 0,0 wa, 0,0 hi, 2,3 si, 0,0 st
total,
268056 used,
180680 free,
33304 buffers
total,
0 used,
102396 free,
165432 cached
Nodo1: senza GZIP compression
Matteo Baccan

JUG Novara, PUG Novara

1754 pagine per 88.44MB di traffico in 1 minuto
$ siege -q -b -t 1m -c5 http://192.168.2.21/phpinfo.php -m pinodo1 -lapache.log
Lifting the server siege...
Transactions:
Availability:
Elapsed time:
Data transferred:
Response time:
Transaction rate:
Throughput:
Concurrency:
Successful transactions:
Failed transactions:
Longest transaction:
Shortest transaction:

done.
1754
100.00
59.27
88.44
0.17
29.59
1.49
4.99
1754
0
0.43
0.11

hits
%
secs
MB
secs
trans/sec
MB/sec

top - 01:29:50 up 3:22, 2 users, load average: 2,47, 1,31, 1,15
Tasks: 73 total,
9 running, 64 sleeping,
0 stopped,
0 zombie
%Cpu(s): 73,7 us, 12,8 sy, 0,0 ni, 0,3 id, 0,0 wa, 0,0 hi, 13,2 si, 0,0 st
KiB Mem:
448736 total,
296424 used,
152312 free,
14848 buffers
KiB Swap:
102396 total,
0 used,
102396 free,
226832 cached
Apache Test
Matteo Baccan

JUG Novara, PUG Novara

Usando Haproxy su un nodo master, ho provato a trasferire sul master la
compressione del dato e scaricare il nodo dal consumo di CPU
Dati di partenza
Date & Time, Trans, Elap Time, Data Trans, Resp Time,
**** pinodo2 php gzip ****
2013-11-26 01:23:18,
765,
59.12,
6,
0.38
**** pinodo1 php ****
2013-11-26 01:21:30,

1809,

59.64,

91,

0.16

59.94,

87,

0.17

Overhead di haproxy

**** hapiserver php nodo1 ****
2013-11-26 01:39:35,
1736,

Compressione lato server: prestazioni doppie rispetto al singolo nodo
**** hapiserver php nodo1 gzip ****
2013-11-26 02:25:39,
1538,
59.44,

15,

0.19
Apache Test
Matteo Baccan

JUG Novara, PUG Novara

Al posto che usare un output generato da PHP, proviamo ora ad usare
direttamente una pagina HTML con lo stesso testo, per capire l’overhead
generato da PHP
Pagina di partenza

**** pinodo1 php ****
2013-11-27 02:54:02,

1757,

59.95,

88,

0.17

**** pinodo1 htm ****
2013-11-27 02:49:27,

5446,

59.52,

279,

0.05

**** haserver php nodo1 gzip ****
2013-11-27 02:46:21,
1479,
59.90,

15,

0.20

**** haserver htm nodo1 gzip ****
2013-11-27 02:47:51,
2808,
59.86,

29,

0.11

**** haserver php 2 nodi ****
2013-11-27 03:13:07,
2580,

26,

0.12

Pagina html

Pagina php nodo1 compressa lato server

Pagina html nodo1 compressa lato server

Pagina php con 2 nodi, compressi lato server: prestazioni 3 volte il singolo nodo
59.47,
Nginx Test
Matteo Baccan

JUG Novara, PUG Novara

Nginx ha dato dei risultati diversi rispetto ad Apache. Per esempio, la perdita di
prestazioni all’atto di una compressione GZIP è assente, anzi si ha un guadagno
lato PHP.
Vengono invece degradate, come ci si aspetterebbe, le prestazioni di HTML
puro.
Oltre a questo viene utilizzata l’interfaccia PHP5-FPM (FastCGI Process
Manager) per interfacciarsi a PHP
**** nodo2
2013-11-29
**** nodo2
2013-11-29

php nginx nogzip ****
02:27:02,
922,
php nginx gzip ****
02:37:33,
1307,

**** nodo2
2013-11-29
**** nodo2
2013-11-29

htm nginx nogzip ****
02:29:31,
4660,
htm nginx gzip ****
02:38:46,
2970,

59.52,

64,

0.32

59.53,

23,

0.23

59.95,

326,

0.06

59.44,

54,

0.10
Monkey test
Matteo Baccan

JUG Novara, PUG Novara

Monkey non dispone di una compressione GZIP, quindi i dati che restituisce
sono sempre quelli presenti su disco.
I risultati sono similari a Apache
**** piserver php monkey ****
2013-11-29 03:35:13,
1502,

59.20,

104,

0.20

**** piserver htm monkey ****
2013-11-29 03:36:41,
4456,

59.10,

332,

0.07

Da notare che sul sito
http://www.monkey-project.com/benchmarks/raspberry_pi_monkey_nginx
Vengono presentati dei benchmark che fanno pensare che Monkey sia più
efficiente rispetto a Nginx, ma il test dura 10 secondi, e il file utilizzato per i test
è un file jpg, dove la compressione è chiaramente inutile, oltre al fatto che un
file di questo tipo dovrebbe risiedere su una CDN e non su un server Monkey
siege -b -t10S -c200 http://localhost:PORT/linux.jpg
Lighttpd test
Matteo Baccan

JUG Novara, PUG Novara

Lighttpd risponde in modo ancora diverso, non comprimendo i file PHP, ma
solamente i file HTML statici.
In questo caso l’aumento prestazionale è molto importante, dovuto anche alla
strategia di compressione di Lighttpd, che verifica lo stato di aggiornamento dei
file statici e se risultano non aggiornati, restituisce una versione “pre”
compressa presente all’interno di una percorso di cache.
**** nodo2 php lighttpd ****
2013-11-29 03:20:10,
1505,

59.13,

104,

0.20

**** nodo2 htm lighttpd ****
2013-11-29 03:21:29, 17575,

59.93,

157,

0.02
Slide's title
Matteo Baccan

JUG Novara, PUG Novara

Cosa abbiamo capito
●

●

●

●

Valutare prestazionalmente PHP su Raspberry può dare risultati molto
diversi, in base al tipo di test che andremo a fare
Alcuni server web sono privi di alcune funzionalità di base (gzip) che prò
possono essere integrate all’interno del bilanciatore
Ottimizzando nel modo corretto, possiamo sfruttare parte della potenza del
processore del bilanciatore, aumentando le prestazioni del nostro HW
Per il tipo di server che andremo ad installare, non c’è una grande differenza
di prestazioni da una soluzione all’altra
JAVA
Matteo Baccan

JUG Novara, PUG Novara
Java su Raspberry Pi
Matteo Baccan

JUG Novara, PUG Novara

Prima del rilascio da parte di Oracle di un JDK specifico per Raspberry Pi,
veniva utilizato OpenJDK
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1~deb7u1+rpi1)
OpenJDK Zero VM (build 20.0-b12, mixed mode)
Da settembre 2013 possiamo installare un “vero” JDK
sudo apt-get install oracle-java7-jdk
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode)
Java su Raspberry Pi
Matteo Baccan

JUG Novara, PUG Novara

Dal sito Oracle è però possibile scaricare ed utilizzare anche un JDK 1.8
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b101)
Java HotSpot(TM) Client VM (build 25.0-b43, mixed mode)
NB
Non credo siano in molti a farlo, quando l’ho fatto io sono stato contattato
direttamente dal supporto Oracle ...
Tomcat
Matteo Baccan

JUG Novara, PUG Novara

Il primo test è stato quello di utilizzare un “evergreen” di Java: Tomcat
versione 7 e 8.
Nonostante la lentezza, il sistema parte in un tempo che oscilla fra i 22
e i 26 secondi
Una volta installato, dopo la prima compilazione, il sistema risponde
senza grossi problemi
JBOSS
Matteo Baccan

JUG Novara, PUG Novara

Il secondo test è stato quello di utilizzare JBOSS
In questo caso è stato necessario modificare delle configurazioni per
poterlo utilizzare dato che la memoria richiesta di default è troppo alta
Occorre quindi modificare i parametri
-Xms64m -Xmx512m
portandoli a valori più coerenti per Raspberry Pi
-Xms64m -Xmx128m
Il sistema parte in circa 150 secondi
Prestazioni
Matteo Baccan

JUG Novara, PUG Novara

Vediamo ora le prestazioni su uno stress test di 1 minuto
Con OpenJDK

**** piserver jdk6 tc 7 ****
2013-11-29 04:13:40,
31,

59.03,

0,

8.82

59.09,

25,

0.12

59.11,

26,

0.12

Con JDK 7

**** piserver jdk8 tc 8 ****
2013-11-29 04:12:18,
2362,

Con JDK8

**** piserver jdk7 tc 8 ****
2013-11-29 04:17:11,
2507,
Conclusioni
Matteo Baccan

JUG Novara, PUG Novara

Una volta partito, utilizzando un JDK 7 o 8, il sistema funziona.
Per poterlo utilizzare al meglio è però necessario procedere
all’ottimizzazione della RAM utilizzata e possibilmente disaccoppiare il
database, in modo da eseguirlo su un’altra macchina o un altro Raspberry
Pi, dato che il quantitativo di RAM disponibile è veramente limitato
Vincitori e vinti
Matteo Baccan

JUG Novara, PUG Novara

JAVA
Sicuramente Java non è il linguaggio migliore da utilizzare all’interno di un
Raspberry Pi, ma grazie agli ultimi rilasci, ora è un linguaggio utilizzabile con
prestazioni accettabili.
Fino a OpenJDK 6 le prestazioni erano decisamente scadenti
PHP
Risulta avvantaggiato dal limitato overhead che richiede al sistema per poter
essere utilizzato, grazie a questo, non è impensabile utilizzare un server
RaspberryPi con un intero stack LAMP installato e con tutte le applicazioni che
ne conseguono
Emulazione
Matteo Baccan

JUG Novara, PUG Novara

Tutto bello, ma se non avessi un Raspberry Pi?
Puoi emularlo con QEMU, utilizzando direttamente le immagini
fornite dal http://www.raspberrypi.org/downloads

DEMO
Domande?
Matteo Baccan

JUG Novara, PUG Novara
Slide's title
Matteo Baccan

JUG Novara, PUG Novara

Matteo Baccan
matteo@baccan.it

Más contenido relacionado

La actualidad más candente

CodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 3 - Corso Linux, Android e Internet of ThingsCodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 3 - Corso Linux, Android e Internet of ThingsMirko Mancin
 
CodingGym - Lezione 2 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 2 - Corso Linux, Android e Internet of ThingsCodingGym - Lezione 2 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 2 - Corso Linux, Android e Internet of ThingsMirko Mancin
 
Matteo baccan raspberry pi - linox 2015 - corso parte 3
Matteo baccan   raspberry pi - linox 2015 - corso parte 3Matteo baccan   raspberry pi - linox 2015 - corso parte 3
Matteo baccan raspberry pi - linox 2015 - corso parte 3Matteo Baccan
 
CodingGym - Lezione 1 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 1 - Corso Linux, Android e Internet of ThingsCodingGym - Lezione 1 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 1 - Corso Linux, Android e Internet of ThingsMirko Mancin
 
Linux Capabilities - ita - v2.1.5 - compatta
Linux Capabilities - ita - v2.1.5 - compattaLinux Capabilities - ita - v2.1.5 - compatta
Linux Capabilities - ita - v2.1.5 - compattaAlessandro Selli
 
Cross compiler per uso domestico
Cross compiler per uso domesticoCross compiler per uso domestico
Cross compiler per uso domesticoBabel
 
Trace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linux
Trace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linuxTrace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linux
Trace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linuxDeveler S.r.l.
 
Richiami su Linux - Webmin - Reti di calcolatori
Richiami su Linux - Webmin - Reti di calcolatoriRichiami su Linux - Webmin - Reti di calcolatori
Richiami su Linux - Webmin - Reti di calcolatoriFulvio Corno
 
Introduzione ad ubuntu core - Qt day 2017
Introduzione ad ubuntu core  - Qt day 2017Introduzione ad ubuntu core  - Qt day 2017
Introduzione ad ubuntu core - Qt day 2017Marco Trevisan
 
BeRTOS: Sistema Real Time Embedded Free
BeRTOS: Sistema Real Time Embedded FreeBeRTOS: Sistema Real Time Embedded Free
BeRTOS: Sistema Real Time Embedded FreeDeveler S.r.l.
 
Primi passi con la scheda BeagleBone Black
Primi passi con la scheda BeagleBone BlackPrimi passi con la scheda BeagleBone Black
Primi passi con la scheda BeagleBone BlackOpen Makers Italy
 
Intro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'AmbrosioIntro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'Ambrosiofirenze-gtug
 
LUG - Logical volumes management
LUG - Logical volumes managementLUG - Logical volumes management
LUG - Logical volumes managementAlessandro Manfredi
 

La actualidad más candente (20)

CodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 3 - Corso Linux, Android e Internet of ThingsCodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
 
Quickr In Real Life - casi di successo di QuickR
 Quickr In Real Life - casi di successo di QuickR Quickr In Real Life - casi di successo di QuickR
Quickr In Real Life - casi di successo di QuickR
 
CodingGym - Lezione 2 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 2 - Corso Linux, Android e Internet of ThingsCodingGym - Lezione 2 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 2 - Corso Linux, Android e Internet of Things
 
Matteo baccan raspberry pi - linox 2015 - corso parte 3
Matteo baccan   raspberry pi - linox 2015 - corso parte 3Matteo baccan   raspberry pi - linox 2015 - corso parte 3
Matteo baccan raspberry pi - linox 2015 - corso parte 3
 
CodingGym - Lezione 1 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 1 - Corso Linux, Android e Internet of ThingsCodingGym - Lezione 1 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 1 - Corso Linux, Android e Internet of Things
 
Linux Capabilities - ita - v2.1.5 - compatta
Linux Capabilities - ita - v2.1.5 - compattaLinux Capabilities - ita - v2.1.5 - compatta
Linux Capabilities - ita - v2.1.5 - compatta
 
Cross compiler per uso domestico
Cross compiler per uso domesticoCross compiler per uso domestico
Cross compiler per uso domestico
 
Openmoko
OpenmokoOpenmoko
Openmoko
 
Dhcp
DhcpDhcp
Dhcp
 
Trace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linux
Trace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linuxTrace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linux
Trace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linux
 
Richiami su Linux - Webmin - Reti di calcolatori
Richiami su Linux - Webmin - Reti di calcolatoriRichiami su Linux - Webmin - Reti di calcolatori
Richiami su Linux - Webmin - Reti di calcolatori
 
Introduzione ad ubuntu core - Qt day 2017
Introduzione ad ubuntu core  - Qt day 2017Introduzione ad ubuntu core  - Qt day 2017
Introduzione ad ubuntu core - Qt day 2017
 
BeRTOS: Sistema Real Time Embedded Free
BeRTOS: Sistema Real Time Embedded FreeBeRTOS: Sistema Real Time Embedded Free
BeRTOS: Sistema Real Time Embedded Free
 
Primi passi con la scheda BeagleBone Black
Primi passi con la scheda BeagleBone BlackPrimi passi con la scheda BeagleBone Black
Primi passi con la scheda BeagleBone Black
 
PostgreSQL : Tuning
PostgreSQL : TuningPostgreSQL : Tuning
PostgreSQL : Tuning
 
Intro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'AmbrosioIntro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'Ambrosio
 
LUG - Logical volumes management
LUG - Logical volumes managementLUG - Logical volumes management
LUG - Logical volumes management
 
Conferenza Pymaemo
Conferenza PymaemoConferenza Pymaemo
Conferenza Pymaemo
 
Da 0 all'open per PA e PMI
Da 0 all'open per PA e PMIDa 0 all'open per PA e PMI
Da 0 all'open per PA e PMI
 
LTSP
LTSPLTSP
LTSP
 

Destacado

Android App Development - Unimore
Android App Development - UnimoreAndroid App Development - Unimore
Android App Development - UnimoreNicola Corti
 
Da Windows a Linux: è tempo di migrare
Da Windows a Linux: è tempo di migrareDa Windows a Linux: è tempo di migrare
Da Windows a Linux: è tempo di migrareNicola Corti
 
Come dove perchè? Ubuntu!
Come dove perchè? Ubuntu!Come dove perchè? Ubuntu!
Come dove perchè? Ubuntu!Nicola Corti
 
Seminario Raspberri Pi - Parte 2 - GULP
Seminario Raspberri Pi - Parte 2 - GULPSeminario Raspberri Pi - Parte 2 - GULP
Seminario Raspberri Pi - Parte 2 - GULPNicola Corti
 
Wi-Fi Hacking for Fun and Profit - Tecniche di intrusione & Contromisure
Wi-Fi Hacking for Fun and Profit - Tecniche di intrusione & ContromisureWi-Fi Hacking for Fun and Profit - Tecniche di intrusione & Contromisure
Wi-Fi Hacking for Fun and Profit - Tecniche di intrusione & Contromisuregianlucaghettini
 
Introduzione a ubuntu - Linux Day 2010
Introduzione a ubuntu - Linux Day 2010Introduzione a ubuntu - Linux Day 2010
Introduzione a ubuntu - Linux Day 2010Nicola Corti
 
Da windows a_linux_ot2013
Da windows a_linux_ot2013Da windows a_linux_ot2013
Da windows a_linux_ot2013Pordenone LUG
 
"Carte da Gioco"
"Carte da Gioco""Carte da Gioco"
"Carte da Gioco"Marta Fais
 
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...Codemotion
 
Raspberry Pi - Il computer che hai sempre voluto avere
Raspberry Pi - Il computer che hai sempre voluto avereRaspberry Pi - Il computer che hai sempre voluto avere
Raspberry Pi - Il computer che hai sempre voluto avereNicola Corti
 
Sintesi e caratterizzazione di nanotubi di carbonio
Sintesi e caratterizzazione di nanotubi di carbonioSintesi e caratterizzazione di nanotubi di carbonio
Sintesi e caratterizzazione di nanotubi di carbonioMarta Agati
 
Seminario Raspberri Pi - Parte 1 - GULP
Seminario Raspberri Pi - Parte 1 - GULPSeminario Raspberri Pi - Parte 1 - GULP
Seminario Raspberri Pi - Parte 1 - GULPNicola Corti
 
Carbonio - Fullereni - Nanotubi - Grafene
Carbonio - Fullereni - Nanotubi - GrafeneCarbonio - Fullereni - Nanotubi - Grafene
Carbonio - Fullereni - Nanotubi - Grafenefx127
 
Senza nome 1
Senza nome 1Senza nome 1
Senza nome 1pekins
 
Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)
Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)
Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)Gabriele Guizzardi
 
Pillole di programmazione in C
Pillole di programmazione in CPillole di programmazione in C
Pillole di programmazione in CNicola Corti
 
Design thinking: Redesign the school-to-work transition
Design thinking: Redesign the school-to-work transitionDesign thinking: Redesign the school-to-work transition
Design thinking: Redesign the school-to-work transitionDaniele Iori
 

Destacado (20)

Fotovoltaico
FotovoltaicoFotovoltaico
Fotovoltaico
 
Android App Development - Unimore
Android App Development - UnimoreAndroid App Development - Unimore
Android App Development - Unimore
 
Da Windows a Linux: è tempo di migrare
Da Windows a Linux: è tempo di migrareDa Windows a Linux: è tempo di migrare
Da Windows a Linux: è tempo di migrare
 
Come dove perchè? Ubuntu!
Come dove perchè? Ubuntu!Come dove perchè? Ubuntu!
Come dove perchè? Ubuntu!
 
Seminario Raspberri Pi - Parte 2 - GULP
Seminario Raspberri Pi - Parte 2 - GULPSeminario Raspberri Pi - Parte 2 - GULP
Seminario Raspberri Pi - Parte 2 - GULP
 
Wi-Fi Hacking for Fun and Profit - Tecniche di intrusione & Contromisure
Wi-Fi Hacking for Fun and Profit - Tecniche di intrusione & ContromisureWi-Fi Hacking for Fun and Profit - Tecniche di intrusione & Contromisure
Wi-Fi Hacking for Fun and Profit - Tecniche di intrusione & Contromisure
 
Introduzione a ubuntu - Linux Day 2010
Introduzione a ubuntu - Linux Day 2010Introduzione a ubuntu - Linux Day 2010
Introduzione a ubuntu - Linux Day 2010
 
Da windows a_linux_ot2013
Da windows a_linux_ot2013Da windows a_linux_ot2013
Da windows a_linux_ot2013
 
"Carte da Gioco"
"Carte da Gioco""Carte da Gioco"
"Carte da Gioco"
 
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
 
iOS_Course_5
iOS_Course_5iOS_Course_5
iOS_Course_5
 
Raspberry Pi - Il computer che hai sempre voluto avere
Raspberry Pi - Il computer che hai sempre voluto avereRaspberry Pi - Il computer che hai sempre voluto avere
Raspberry Pi - Il computer che hai sempre voluto avere
 
Sintesi e caratterizzazione di nanotubi di carbonio
Sintesi e caratterizzazione di nanotubi di carbonioSintesi e caratterizzazione di nanotubi di carbonio
Sintesi e caratterizzazione di nanotubi di carbonio
 
Seminario Raspberri Pi - Parte 1 - GULP
Seminario Raspberri Pi - Parte 1 - GULPSeminario Raspberri Pi - Parte 1 - GULP
Seminario Raspberri Pi - Parte 1 - GULP
 
Carbonio - Fullereni - Nanotubi - Grafene
Carbonio - Fullereni - Nanotubi - GrafeneCarbonio - Fullereni - Nanotubi - Grafene
Carbonio - Fullereni - Nanotubi - Grafene
 
Senza nome 1
Senza nome 1Senza nome 1
Senza nome 1
 
Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)
Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)
Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)
 
Grundlagen modul it
Grundlagen modul itGrundlagen modul it
Grundlagen modul it
 
Pillole di programmazione in C
Pillole di programmazione in CPillole di programmazione in C
Pillole di programmazione in C
 
Design thinking: Redesign the school-to-work transition
Design thinking: Redesign the school-to-work transitionDesign thinking: Redesign the school-to-work transition
Design thinking: Redesign the school-to-work transition
 

Similar a Codemotion 2013: Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster

Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"Camelug Fava
 
Raspberry omv
Raspberry omvRaspberry omv
Raspberry omvPipperss
 
Installazione ambientepython ubuntumate
Installazione ambientepython ubuntumateInstallazione ambientepython ubuntumate
Installazione ambientepython ubuntumateMarco Buttolo
 
Stanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al PrgressiveStanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al PrgressiveCommit University
 
Introduzione a RaspBerry PI
Introduzione a RaspBerry PIIntroduzione a RaspBerry PI
Introduzione a RaspBerry PIPaolo Aliverti
 
Progetto Linux va a scuola - Descrizione tecnica
Progetto Linux va a scuola - Descrizione tecnicaProgetto Linux va a scuola - Descrizione tecnica
Progetto Linux va a scuola - Descrizione tecnicaBergamo Linux Users Group
 
Chakra_recensione
Chakra_recensioneChakra_recensione
Chakra_recensioneandreazube
 
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...
Con Aruba, a lezione di Cloud  #lezione 30 - parte 2: 'GitLab e Cloud Server ...Con Aruba, a lezione di Cloud  #lezione 30 - parte 2: 'GitLab e Cloud Server ...
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...Aruba S.p.A.
 
Chakra 2012.9 rec
Chakra 2012.9 recChakra 2012.9 rec
Chakra 2012.9 reckdekda
 
TYPO3 e la partenza intelligente. Familiarizzare con l'ambiente e lo strument...
TYPO3 e la partenza intelligente. Familiarizzare con l'ambiente e lo strument...TYPO3 e la partenza intelligente. Familiarizzare con l'ambiente e lo strument...
TYPO3 e la partenza intelligente. Familiarizzare con l'ambiente e lo strument...gammsystem
 
Installare i server via rete con Cobbler
Installare i server via rete con CobblerInstallare i server via rete con Cobbler
Installare i server via rete con CobblerBabel
 
Il dual boot scolastico perfetto (2012)
Il dual boot scolastico perfetto (2012)Il dual boot scolastico perfetto (2012)
Il dual boot scolastico perfetto (2012)Marcello Missiroli
 
Come installare TIBCO Jasper Reports Server 7.5 Community Edition su RedHat J...
Come installare TIBCO Jasper Reports Server 7.5 Community Edition su RedHat J...Come installare TIBCO Jasper Reports Server 7.5 Community Edition su RedHat J...
Come installare TIBCO Jasper Reports Server 7.5 Community Edition su RedHat J...Antonio Musarra
 
[LDNA2018] - JACK Audio Connection Kit: la tua Patchbay virtuale!
[LDNA2018] - JACK Audio Connection Kit: la tua Patchbay virtuale![LDNA2018] - JACK Audio Connection Kit: la tua Patchbay virtuale!
[LDNA2018] - JACK Audio Connection Kit: la tua Patchbay virtuale!Marcello Marino
 
Monitoraggio della rete con cacti
Monitoraggio della rete con cactiMonitoraggio della rete con cacti
Monitoraggio della rete con cactidalegiuseppe
 
Linux Day 2015 Genova
Linux Day 2015 GenovaLinux Day 2015 Genova
Linux Day 2015 Genovamperrando
 
Javaday 2009 php e java
Javaday 2009 php e javaJavaday 2009 php e java
Javaday 2009 php e javaMatteo Baccan
 
JACK Audio Connection Kit
JACK Audio Connection KitJACK Audio Connection Kit
JACK Audio Connection KitNaLUG
 

Similar a Codemotion 2013: Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster (20)

Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
 
TuxIsAlive
TuxIsAliveTuxIsAlive
TuxIsAlive
 
Raspberry omv
Raspberry omvRaspberry omv
Raspberry omv
 
Installazione ambientepython ubuntumate
Installazione ambientepython ubuntumateInstallazione ambientepython ubuntumate
Installazione ambientepython ubuntumate
 
Standard Dev Workflow
Standard Dev WorkflowStandard Dev Workflow
Standard Dev Workflow
 
Stanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al PrgressiveStanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al Prgressive
 
Introduzione a RaspBerry PI
Introduzione a RaspBerry PIIntroduzione a RaspBerry PI
Introduzione a RaspBerry PI
 
Progetto Linux va a scuola - Descrizione tecnica
Progetto Linux va a scuola - Descrizione tecnicaProgetto Linux va a scuola - Descrizione tecnica
Progetto Linux va a scuola - Descrizione tecnica
 
Chakra_recensione
Chakra_recensioneChakra_recensione
Chakra_recensione
 
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...
Con Aruba, a lezione di Cloud  #lezione 30 - parte 2: 'GitLab e Cloud Server ...Con Aruba, a lezione di Cloud  #lezione 30 - parte 2: 'GitLab e Cloud Server ...
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...
 
Chakra 2012.9 rec
Chakra 2012.9 recChakra 2012.9 rec
Chakra 2012.9 rec
 
TYPO3 e la partenza intelligente. Familiarizzare con l'ambiente e lo strument...
TYPO3 e la partenza intelligente. Familiarizzare con l'ambiente e lo strument...TYPO3 e la partenza intelligente. Familiarizzare con l'ambiente e lo strument...
TYPO3 e la partenza intelligente. Familiarizzare con l'ambiente e lo strument...
 
Installare i server via rete con Cobbler
Installare i server via rete con CobblerInstallare i server via rete con Cobbler
Installare i server via rete con Cobbler
 
Il dual boot scolastico perfetto (2012)
Il dual boot scolastico perfetto (2012)Il dual boot scolastico perfetto (2012)
Il dual boot scolastico perfetto (2012)
 
Come installare TIBCO Jasper Reports Server 7.5 Community Edition su RedHat J...
Come installare TIBCO Jasper Reports Server 7.5 Community Edition su RedHat J...Come installare TIBCO Jasper Reports Server 7.5 Community Edition su RedHat J...
Come installare TIBCO Jasper Reports Server 7.5 Community Edition su RedHat J...
 
[LDNA2018] - JACK Audio Connection Kit: la tua Patchbay virtuale!
[LDNA2018] - JACK Audio Connection Kit: la tua Patchbay virtuale![LDNA2018] - JACK Audio Connection Kit: la tua Patchbay virtuale!
[LDNA2018] - JACK Audio Connection Kit: la tua Patchbay virtuale!
 
Monitoraggio della rete con cacti
Monitoraggio della rete con cactiMonitoraggio della rete con cacti
Monitoraggio della rete con cacti
 
Linux Day 2015 Genova
Linux Day 2015 GenovaLinux Day 2015 Genova
Linux Day 2015 Genova
 
Javaday 2009 php e java
Javaday 2009 php e javaJavaday 2009 php e java
Javaday 2009 php e java
 
JACK Audio Connection Kit
JACK Audio Connection KitJACK Audio Connection Kit
JACK Audio Connection Kit
 

Más de Matteo Baccan

javaday 2006 - Tiger
javaday 2006 - Tigerjavaday 2006 - Tiger
javaday 2006 - TigerMatteo Baccan
 
Phpday 2009 php e java
Phpday 2009 php e javaPhpday 2009 php e java
Phpday 2009 php e javaMatteo Baccan
 
Confsl 2010 Facebook Framework
Confsl 2010 Facebook FrameworkConfsl 2010 Facebook Framework
Confsl 2010 Facebook FrameworkMatteo Baccan
 
Stack Overflow meetup html2pop3
Stack Overflow meetup html2pop3 Stack Overflow meetup html2pop3
Stack Overflow meetup html2pop3 Matteo Baccan
 
Codemotion 2012 : Sphinx: Open Source Search Server
Codemotion 2012 : Sphinx: Open Source Search ServerCodemotion 2012 : Sphinx: Open Source Search Server
Codemotion 2012 : Sphinx: Open Source Search ServerMatteo Baccan
 
Codemotion twitter programming
Codemotion twitter programmingCodemotion twitter programming
Codemotion twitter programmingMatteo Baccan
 
Webtech 2010: twitter programming
Webtech 2010: twitter programmingWebtech 2010: twitter programming
Webtech 2010: twitter programmingMatteo Baccan
 
Webtech 2010: facebook framework
Webtech 2010: facebook frameworkWebtech 2010: facebook framework
Webtech 2010: facebook frameworkMatteo Baccan
 
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, javaMatteo Baccan
 
Webbit 2004: Aspectj
Webbit 2004: AspectjWebbit 2004: Aspectj
Webbit 2004: AspectjMatteo Baccan
 
JIPDay 2005: Xlet Java Programming
JIPDay 2005: Xlet Java ProgrammingJIPDay 2005: Xlet Java Programming
JIPDay 2005: Xlet Java ProgrammingMatteo Baccan
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5Matteo Baccan
 
Javaday 2007: skype4java
Javaday 2007: skype4javaJavaday 2007: skype4java
Javaday 2007: skype4javaMatteo Baccan
 
Phpday 2010: facebook php framework
Phpday 2010: facebook php frameworkPhpday 2010: facebook php framework
Phpday 2010: facebook php frameworkMatteo Baccan
 
Javaday 2010: Facebook Java Framework
Javaday 2010: Facebook Java FrameworkJavaday 2010: Facebook Java Framework
Javaday 2010: Facebook Java FrameworkMatteo Baccan
 

Más de Matteo Baccan (16)

Gmail e google app
Gmail e google appGmail e google app
Gmail e google app
 
javaday 2006 - Tiger
javaday 2006 - Tigerjavaday 2006 - Tiger
javaday 2006 - Tiger
 
Phpday 2009 php e java
Phpday 2009 php e javaPhpday 2009 php e java
Phpday 2009 php e java
 
Confsl 2010 Facebook Framework
Confsl 2010 Facebook FrameworkConfsl 2010 Facebook Framework
Confsl 2010 Facebook Framework
 
Stack Overflow meetup html2pop3
Stack Overflow meetup html2pop3 Stack Overflow meetup html2pop3
Stack Overflow meetup html2pop3
 
Codemotion 2012 : Sphinx: Open Source Search Server
Codemotion 2012 : Sphinx: Open Source Search ServerCodemotion 2012 : Sphinx: Open Source Search Server
Codemotion 2012 : Sphinx: Open Source Search Server
 
Codemotion twitter programming
Codemotion twitter programmingCodemotion twitter programming
Codemotion twitter programming
 
Webtech 2010: twitter programming
Webtech 2010: twitter programmingWebtech 2010: twitter programming
Webtech 2010: twitter programming
 
Webtech 2010: facebook framework
Webtech 2010: facebook frameworkWebtech 2010: facebook framework
Webtech 2010: facebook framework
 
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, java
 
Webbit 2004: Aspectj
Webbit 2004: AspectjWebbit 2004: Aspectj
Webbit 2004: Aspectj
 
JIPDay 2005: Xlet Java Programming
JIPDay 2005: Xlet Java ProgrammingJIPDay 2005: Xlet Java Programming
JIPDay 2005: Xlet Java Programming
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5
 
Javaday 2007: skype4java
Javaday 2007: skype4javaJavaday 2007: skype4java
Javaday 2007: skype4java
 
Phpday 2010: facebook php framework
Phpday 2010: facebook php frameworkPhpday 2010: facebook php framework
Phpday 2010: facebook php framework
 
Javaday 2010: Facebook Java Framework
Javaday 2010: Facebook Java FrameworkJavaday 2010: Facebook Java Framework
Javaday 2010: Facebook Java Framework
 

Codemotion 2013: Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster

  • 1. Matteo Baccan Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster matteo@baccan.it
  • 2. Chi sono? Matteo Baccan JUG Novara, PUG Novara Matteo Baccan Divulgatore informatico, giornalista per riviste tecniche nazionali oltre 700 articoli per :Dev, Login, Computer Programming, Mokabyte. Relatore tecnico ad eventi di programmazione: Borland Forum 2000, Webbit 2004, JIP day 2005, Javaday (2006,2007,2010) PHPDay (2008, 2010), CONFSL 2010, WebTech 2010, Codemotin (2011,2012,2013). Autore di Corso di C# ISBN 8881500167. Autore di JobCrawler e HTML2POP3 (Oltre 900.000 download su SourceForge)
  • 3. Programma Matteo Baccan JUG Novara, PUG Novara Il mio motto la felicità è vera solo se condivisa so che è una frase di “Into the Wild”
  • 4. Programma Matteo Baccan JUG Novara, PUG Novara Cosa vedremo Cos’è Raspberry Pi ● Cosa ci possiamo fare ● Alcune ottimizzazioni del sistema di base ● PHP su Raspberry Pi ● Java su Raspberry Pi ● Alternative per lo sviluppo ● Emulazione ●
  • 5. Cos’è Raspberry Pi Matteo Baccan JUG Novara, PUG Novara Tratto da : http://it.wikipedia.org/wiki/Raspberry_Pi Il Raspberry Pi è un single-board computer (SBC) sviluppato nel Regno Unito dalla Raspberry Pi Foundation. Il suo lancio al pubblico è avvenuto alla fine del mese di febbraio 2012. L'idea di base è la realizzazione di un dispositivo economico, concepito per stimolare l'insegnamento di base dell'informatica e della programmazione nelle scuole Il progetto ruota attorno a un System-on-a-chip (SoC) Broadcom BCM2835, che incorpora un processore ARM1176JZF-S a 700 MHz, una GPU VideoCore IV, e 256 o 512 Megabyte di memoria. Il progetto non prevede né hard disk né una unità a stato solido, affidandosi invece a una scheda SD per il boot e per la memoria non volatile. La scheda è stata progettata per ospitare sistemi operativi basati su un kernel Linux o RISC OS.
  • 6. Cosa ci possiamo fare Matteo Baccan per chi non l'avesse mai visto JUG Novara, PUG Novara
  • 7. Cosa installare Matteo Baccan JUG Novara, PUG Novara Il punto di partenza è sicuramente NOOBS (attualmente v 1.3.2) http://www.raspberrypi.org/downloads
  • 8. Cosa installare Matteo Baccan JUG Novara, PUG Novara All’interno di NOOBS (New Out Of Box Software) è possibile trovare una serie di sistemi operativi installabili Raspbian : Il porting di Debian 7 “Wheezy”, ottimizzato per Raspberry Pi (consigliata) Pidora: Pidora is a Fedora Remix optimized for the Raspberry Pi Arch: An Arch Linux port for ARM devices OpenELEC: is a fast and userfriendly XBMC Mediacenter distribution. RaspBMC: An XBMC media center distribution for Raspberry Pi RISC OS: is a very fast and compact system
  • 9. Raspbian Matteo Baccan JUG Novara, PUG Novara Oggi parleremo di Raspbian È una distribuzione pensata per essere “general purpose”, con un utilizzo client Non esiste una versione server ufficiale di Raspbian Vediamo insieme come costruirla. Iniziamo a spremere il nostro lampone
  • 10. Raspbian Server Edition Matteo Baccan JUG Novara, PUG Novara Per fortuna qualcuno si è posto il problema di non avere una distribuzione ottimizzata per una configurazione server e ha realizzato Raspbian Server Edition 2.5 http://sirlagz.net/2013/07/19/raspbian-server-edition-2-5/ In realtà è una Raspbian basata su Debian 7 Wheezy portata a Debian 8 Jessie, con la rimozione di una serie di pacchetti “inutili” a livello server. Parte dal concetto che: un “purista” considera peccaminoso l’utilizzo di una GUI su un server, viene quindi rimosso LXDE e tutti i relativi pacchetti, più una serie di pacchetti non necessari su un server
  • 11. Raspbian Server Edition Matteo Baccan JUG Novara, PUG Novara Non dobbiamo però essere ottimisti: la sola rimozione dei pacchetti inutili non basta a realizzare una versione server di Raspberry Pi. Vediamo quali altre tecniche ci permettono di migliorare i 2 aspetti che possono cambiare notevolmente le prestazioni di un Raspberry Pi velocità memoria
  • 12. Velocità: Overclock guidato Matteo Baccan JUG Novara, PUG Novara Chi non ha mai provato ad “overcloccare” il proprio computer? Con Raspberry Pi l’overclock è ammesso e di sistema. Tramite l’utility di configurazione : sudo raspi-config
  • 13. Velocità: Overclock manuale Matteo Baccan JUG Novara, PUG Novara Per chi volesse provare manualmente, basta modificare direttamente il file sudo nano /boot/config.txt Sul forum Raspberry Pi sono indicate altre configurazioni possibili, che possono farci arrivare alla frequenza di 1150MHz. Per info http://elinux.org/RPiconfig arm_freq 800 900 900 930 1000 gpu_freq 275 350 Manualmente 1050 1150 core_freq 450 500 500 sdram_freq over_voltage 500 450 500 500 6 600 6 8
  • 14. Velocità: Overclock manuale Matteo Baccan JUG Novara, PUG Novara Ci sono comunque anche voci di overclock a 1200 MHz e per chi volesse provare, sono disponibili sul mercato dissipatori a 7 euro, in grado di diminuire di qualche grado la temperatura del processore. Oppure se avete ancora in cantina dei vecchi PC .. staccategli la ventolina, costerà ancora meno :)
  • 15. Memoria: Condivisione memoria CPU/GPU Matteo Baccan JUG Novara, PUG Novara Cambio allocazione della memoria CPU/GPU Di default Raspberry Pi parte con 64MB di ram per la GPU. Installando un sistema server possiamo diminuire questa memoria a 16MB Possiamo modifiare /boot/config.txt gpu_mem=16 o usare raspi-config
  • 16. Memoria: Sessioni terminale inutili Matteo Baccan JUG Novara, PUG Novara Ottimizzazione servizi esistenti sudo nano /etc/inittab Al netto delle rimozioni fatte su Raspbian, possiamo ancora ottimizzare diminuendo i processi per le connessioni terminale, passando dalle 6 (default) a 2 . 1:2345:respawn:/sbin/getty --noclear 38400 tty1 2:23:respawn:/sbin/getty 38400 tty2 #3:23:respawn:/sbin/getty 38400 tty3 #4:23:respawn:/sbin/getty 38400 tty4 #5:23:respawn:/sbin/getty 38400 tty5 #6:23:respawn:/sbin/getty 38400 tty6
  • 17. Consuntivo PRE/POST ottimizzazioni Matteo Baccan JUG Novara, PUG Novara Aumento velocità di elaborazione passando da 700 a 1000 MHz = 50% Aumento di memoria = 60% pi@piserver ~ $ free total used free shared buffers cached 497504 58816 438688 0 15588 26976 -/+ buffers/cache: 16252 481252 0 102396 total used free shared buffers cached 448736 175880 272856 0 18368 137004 -/+ buffers/cache: 20508 428228 0 102396 Mem: Swap: 102396 pi@pinodo2 ~ $ free Mem: Swap: 102396
  • 18. Per chi vuole osare Matteo Baccan JUG Novara, PUG Novara Possiamo spremere ancora di più Raspberry Pi ● staccando alcuni degli ultimi servizi attivi (p.e. rsyslog) ● passando ad 1 sessione terminale ● ● aumentando l’overclock e trovando un modo affidabile per raffreddare il processore (in passato ho utilizzato un ventilatore) acquistare delle SD più performanti (classe 10) Ricordiamoci che l’overclock esagerato potrebbe rendere le SD utilizzate dal sistema operativo inutilizzabili. Se questo non vi spaventa e avete già bruciato qualche processore (so che per qualcuno che legge queste slide non sarebbe la prima volta) allora potete osare. Fino alla configurazione indicata, funziona tutto, oltre, basta provare :)
  • 20. Stack LAMP Matteo Baccan JUG Novara, PUG Novara Installazione stack LAMP Ora che abbiamo ottimizzato Raspberry Pi, possiamo passare allo stack LAMP Di default, lo stack LAMP non è installato su Raspbian. Essendo un sistema Linux, l’installazione dello stack LAMP è identica a quella che si farebbe su un qualsiasi server Debian non Raspberry Pi
  • 21. Stack LAMP Matteo Baccan JUG Novara, PUG Novara Installiamo lo stack LAMP sudo apt-get install apache2 php5 mysql-server libapache2-mod-php5 php5-mysql php5-fpm mysql-client phpmyadmin Linux Apache MySQL PHP Wheezy 2.2.22 5.5.31 5.4.4 Jessie 2.4.6 5.5.33 5.5.5 (bi-zona) Nessuno ci vieta di installare versioni diverse
  • 22. Alternative ad Apache Matteo Baccan sudo apt-get install nginx JUG Novara, PUG Novara NGINX MONKEY sudo nano /etc/apt/sources.list deb http://packages.monkey-project.com/primates_pi primates_pi main apt-get update sudo apt-get install monkey monkey-liana monkey-logger monkey-dirlisting monkey-cgi monkey-fastcgi monkey-mandril monkey-cheetah Monkey-auth LIGHTTPD sudo apt-get install lighttpd
  • 23. Stress test e Bilanciatore Matteo Baccan JUG Novara, PUG Novara Per valutare le prestazioni del sistema sono necessari 2 tool ● Programma di Stress Test. Nel mio caso ho installato e compilato siege3.0.5 su Cygwin (lo so sono un programmatore Windows) wget http://www.joedog.org/pub/siege/siege-3.0.5.tar.gz ● Un bilanciatore di carico, in questo caso l’ho utilizzato direttamente sul nodo Master del cluster di test wget http://haproxy.1wt.eu/download/1.5/src/devel/haproxy-1.5-dev19.tar.gz make TARGET=linux2628 USE_ZLIB=1 Ho scelto di non utilizzare haproxy 1.4 presente in Raspbian Pi, dato che non è presente una importante feature : la compressione GZIP
  • 24. Ambiente di test Matteo Baccan JUG Novara, PUG Novara Per i test ho optato per 2 file diversi, in modo da verificare le ottimizzazioni possibili in caso di risorse testuali (html, css, js, etc) ● ● <?php phpinfo() ?> Il sorgente html di phpinfo Ho volutamente evitato di parlare di risorse non testuali già compresse (immagini, filmati) in quanto occorrerebbe una trattazione apposita, e la realizzazione di un server specializzato nel delivery di risorse statiche (la classica installazione CDN) I test sono stati fatti tutti mettendo in concorrenza 5 processi sullo stesso server, dato che stiamo pensando ad un ambiente web di test o dedicato a piccole aziende, dove non vengono superati i 5000 unique user al giorno
  • 25. Ambiente di test Matteo Baccan JUG Novara, PUG Novara Nodo server: haproxy LAMP a default LAMP modificato
  • 26. Nodo2 a default: GZIP compression Matteo Baccan JUG Novara, PUG Novara 780 pagine per 6.81MB di traffico in 1 minuto $ siege -q -b -t 1m -c5 http://192.168.2.22/phpinfo.php -m pinodo2 -lapache.log Lifting the server siege... Transactions: Availability: Elapsed time: Data transferred: Response time: Transaction rate: Throughput: Concurrency: Successful transactions: Failed transactions: Longest transaction: Shortest transaction: top - 01:27:59 up Tasks: 72 total, %Cpu(s): 92,6 us, KiB Mem: 448736 KiB Swap: 102396 done. 780 100.00 59.93 6.81 0.38 13.01 0.11 4.99 780 0 1.02 0.19 hits % secs MB secs trans/sec MB/sec 3:20, 1 user, load average: 3,66, 1,84, 0,85 7 running, 65 sleeping, 0 stopped, 0 zombie 5,2 sy, 0,0 ni, 0,0 id, 0,0 wa, 0,0 hi, 2,3 si, 0,0 st total, 268056 used, 180680 free, 33304 buffers total, 0 used, 102396 free, 165432 cached
  • 27. Nodo1: senza GZIP compression Matteo Baccan JUG Novara, PUG Novara 1754 pagine per 88.44MB di traffico in 1 minuto $ siege -q -b -t 1m -c5 http://192.168.2.21/phpinfo.php -m pinodo1 -lapache.log Lifting the server siege... Transactions: Availability: Elapsed time: Data transferred: Response time: Transaction rate: Throughput: Concurrency: Successful transactions: Failed transactions: Longest transaction: Shortest transaction: done. 1754 100.00 59.27 88.44 0.17 29.59 1.49 4.99 1754 0 0.43 0.11 hits % secs MB secs trans/sec MB/sec top - 01:29:50 up 3:22, 2 users, load average: 2,47, 1,31, 1,15 Tasks: 73 total, 9 running, 64 sleeping, 0 stopped, 0 zombie %Cpu(s): 73,7 us, 12,8 sy, 0,0 ni, 0,3 id, 0,0 wa, 0,0 hi, 13,2 si, 0,0 st KiB Mem: 448736 total, 296424 used, 152312 free, 14848 buffers KiB Swap: 102396 total, 0 used, 102396 free, 226832 cached
  • 28. Apache Test Matteo Baccan JUG Novara, PUG Novara Usando Haproxy su un nodo master, ho provato a trasferire sul master la compressione del dato e scaricare il nodo dal consumo di CPU Dati di partenza Date & Time, Trans, Elap Time, Data Trans, Resp Time, **** pinodo2 php gzip **** 2013-11-26 01:23:18, 765, 59.12, 6, 0.38 **** pinodo1 php **** 2013-11-26 01:21:30, 1809, 59.64, 91, 0.16 59.94, 87, 0.17 Overhead di haproxy **** hapiserver php nodo1 **** 2013-11-26 01:39:35, 1736, Compressione lato server: prestazioni doppie rispetto al singolo nodo **** hapiserver php nodo1 gzip **** 2013-11-26 02:25:39, 1538, 59.44, 15, 0.19
  • 29. Apache Test Matteo Baccan JUG Novara, PUG Novara Al posto che usare un output generato da PHP, proviamo ora ad usare direttamente una pagina HTML con lo stesso testo, per capire l’overhead generato da PHP Pagina di partenza **** pinodo1 php **** 2013-11-27 02:54:02, 1757, 59.95, 88, 0.17 **** pinodo1 htm **** 2013-11-27 02:49:27, 5446, 59.52, 279, 0.05 **** haserver php nodo1 gzip **** 2013-11-27 02:46:21, 1479, 59.90, 15, 0.20 **** haserver htm nodo1 gzip **** 2013-11-27 02:47:51, 2808, 59.86, 29, 0.11 **** haserver php 2 nodi **** 2013-11-27 03:13:07, 2580, 26, 0.12 Pagina html Pagina php nodo1 compressa lato server Pagina html nodo1 compressa lato server Pagina php con 2 nodi, compressi lato server: prestazioni 3 volte il singolo nodo 59.47,
  • 30. Nginx Test Matteo Baccan JUG Novara, PUG Novara Nginx ha dato dei risultati diversi rispetto ad Apache. Per esempio, la perdita di prestazioni all’atto di una compressione GZIP è assente, anzi si ha un guadagno lato PHP. Vengono invece degradate, come ci si aspetterebbe, le prestazioni di HTML puro. Oltre a questo viene utilizzata l’interfaccia PHP5-FPM (FastCGI Process Manager) per interfacciarsi a PHP **** nodo2 2013-11-29 **** nodo2 2013-11-29 php nginx nogzip **** 02:27:02, 922, php nginx gzip **** 02:37:33, 1307, **** nodo2 2013-11-29 **** nodo2 2013-11-29 htm nginx nogzip **** 02:29:31, 4660, htm nginx gzip **** 02:38:46, 2970, 59.52, 64, 0.32 59.53, 23, 0.23 59.95, 326, 0.06 59.44, 54, 0.10
  • 31. Monkey test Matteo Baccan JUG Novara, PUG Novara Monkey non dispone di una compressione GZIP, quindi i dati che restituisce sono sempre quelli presenti su disco. I risultati sono similari a Apache **** piserver php monkey **** 2013-11-29 03:35:13, 1502, 59.20, 104, 0.20 **** piserver htm monkey **** 2013-11-29 03:36:41, 4456, 59.10, 332, 0.07 Da notare che sul sito http://www.monkey-project.com/benchmarks/raspberry_pi_monkey_nginx Vengono presentati dei benchmark che fanno pensare che Monkey sia più efficiente rispetto a Nginx, ma il test dura 10 secondi, e il file utilizzato per i test è un file jpg, dove la compressione è chiaramente inutile, oltre al fatto che un file di questo tipo dovrebbe risiedere su una CDN e non su un server Monkey siege -b -t10S -c200 http://localhost:PORT/linux.jpg
  • 32. Lighttpd test Matteo Baccan JUG Novara, PUG Novara Lighttpd risponde in modo ancora diverso, non comprimendo i file PHP, ma solamente i file HTML statici. In questo caso l’aumento prestazionale è molto importante, dovuto anche alla strategia di compressione di Lighttpd, che verifica lo stato di aggiornamento dei file statici e se risultano non aggiornati, restituisce una versione “pre” compressa presente all’interno di una percorso di cache. **** nodo2 php lighttpd **** 2013-11-29 03:20:10, 1505, 59.13, 104, 0.20 **** nodo2 htm lighttpd **** 2013-11-29 03:21:29, 17575, 59.93, 157, 0.02
  • 33. Slide's title Matteo Baccan JUG Novara, PUG Novara Cosa abbiamo capito ● ● ● ● Valutare prestazionalmente PHP su Raspberry può dare risultati molto diversi, in base al tipo di test che andremo a fare Alcuni server web sono privi di alcune funzionalità di base (gzip) che prò possono essere integrate all’interno del bilanciatore Ottimizzando nel modo corretto, possiamo sfruttare parte della potenza del processore del bilanciatore, aumentando le prestazioni del nostro HW Per il tipo di server che andremo ad installare, non c’è una grande differenza di prestazioni da una soluzione all’altra
  • 35. Java su Raspberry Pi Matteo Baccan JUG Novara, PUG Novara Prima del rilascio da parte di Oracle di un JDK specifico per Raspberry Pi, veniva utilizato OpenJDK java version "1.6.0_27" OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1~deb7u1+rpi1) OpenJDK Zero VM (build 20.0-b12, mixed mode) Da settembre 2013 possiamo installare un “vero” JDK sudo apt-get install oracle-java7-jdk java version "1.7.0_40" Java(TM) SE Runtime Environment (build 1.7.0_40-b43) Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode)
  • 36. Java su Raspberry Pi Matteo Baccan JUG Novara, PUG Novara Dal sito Oracle è però possibile scaricare ed utilizzare anche un JDK 1.8 java version "1.8.0-ea" Java(TM) SE Runtime Environment (build 1.8.0-ea-b101) Java HotSpot(TM) Client VM (build 25.0-b43, mixed mode) NB Non credo siano in molti a farlo, quando l’ho fatto io sono stato contattato direttamente dal supporto Oracle ...
  • 37. Tomcat Matteo Baccan JUG Novara, PUG Novara Il primo test è stato quello di utilizzare un “evergreen” di Java: Tomcat versione 7 e 8. Nonostante la lentezza, il sistema parte in un tempo che oscilla fra i 22 e i 26 secondi Una volta installato, dopo la prima compilazione, il sistema risponde senza grossi problemi
  • 38. JBOSS Matteo Baccan JUG Novara, PUG Novara Il secondo test è stato quello di utilizzare JBOSS In questo caso è stato necessario modificare delle configurazioni per poterlo utilizzare dato che la memoria richiesta di default è troppo alta Occorre quindi modificare i parametri -Xms64m -Xmx512m portandoli a valori più coerenti per Raspberry Pi -Xms64m -Xmx128m Il sistema parte in circa 150 secondi
  • 39. Prestazioni Matteo Baccan JUG Novara, PUG Novara Vediamo ora le prestazioni su uno stress test di 1 minuto Con OpenJDK **** piserver jdk6 tc 7 **** 2013-11-29 04:13:40, 31, 59.03, 0, 8.82 59.09, 25, 0.12 59.11, 26, 0.12 Con JDK 7 **** piserver jdk8 tc 8 **** 2013-11-29 04:12:18, 2362, Con JDK8 **** piserver jdk7 tc 8 **** 2013-11-29 04:17:11, 2507,
  • 40. Conclusioni Matteo Baccan JUG Novara, PUG Novara Una volta partito, utilizzando un JDK 7 o 8, il sistema funziona. Per poterlo utilizzare al meglio è però necessario procedere all’ottimizzazione della RAM utilizzata e possibilmente disaccoppiare il database, in modo da eseguirlo su un’altra macchina o un altro Raspberry Pi, dato che il quantitativo di RAM disponibile è veramente limitato
  • 41. Vincitori e vinti Matteo Baccan JUG Novara, PUG Novara JAVA Sicuramente Java non è il linguaggio migliore da utilizzare all’interno di un Raspberry Pi, ma grazie agli ultimi rilasci, ora è un linguaggio utilizzabile con prestazioni accettabili. Fino a OpenJDK 6 le prestazioni erano decisamente scadenti PHP Risulta avvantaggiato dal limitato overhead che richiede al sistema per poter essere utilizzato, grazie a questo, non è impensabile utilizzare un server RaspberryPi con un intero stack LAMP installato e con tutte le applicazioni che ne conseguono
  • 42. Emulazione Matteo Baccan JUG Novara, PUG Novara Tutto bello, ma se non avessi un Raspberry Pi? Puoi emularlo con QEMU, utilizzando direttamente le immagini fornite dal http://www.raspberrypi.org/downloads DEMO
  • 44. Slide's title Matteo Baccan JUG Novara, PUG Novara Matteo Baccan matteo@baccan.it