Archivio

Archivio per la categoria ‘Server’

MySQL Tuning

6 febbraio 2010 Nessun commento

Con l’installazione di default la configurazione del servizio mysql viene impostata ad un livello “standard” che va piu’ o meno bene su tutti i server.
In questo articolo vedremo come ottimizzare il valore associato alle variabili presenti nella configurazione, ottimizzandola in base alla memoria e all’hardware disponibile sul nostro server.

key_buffer_size

Indica la quantita’ di indici (i file con estensione MYI) delle tabelle di tipo MYISAM mantenuti in memoria.
L’ideale sarebbe quello di poter contenere in RAM tutti i file di questo tipo.
Il valore attribuito a questa variabile non deve superare la meta’ di tutta la RAM dedicata al servizio mysqld.
Se non potete mettere in memoria tutti i file MYI potrete fare questa ottimizzazione:

Accedete nella console di mysql ed eseguite questa query

show status like ‘%key_read%’;

Dividete il valore di key_read_requests per key_read;
Il risultato deve essere maggiore di 100.

Si imposta nella sezione [mysql] ad es.

[mysqld]
key_buffer_size = 64M

table_cache

Quando mysql accede ad una tabella, la carica in cache. La migliore delle situazioni sarebbe quella di avere una cache talmente grande da contenere
tutte le tabelle aperte in un dato momento.
Per verificare quante tabelle sono aperte in un determinato istante eseguiamo questa query

show status like ‘open_tables’;

Analizzando questo valore nel tempo, possiamo valutare i picchi massimi

Possiamo verificare anche quante tabelle sono state aperte dall’esecuzione del servizio mysql

show status like ‘opened_tables’;

Avremo modo cosi’ di capire se open_tables e’ “attendibile” oppure momentaneamente superiore/inferiore alla media.

Si imposta nella sezione [mysql] ad es.

[mysqld]
table_cache  = NUMERO

thread_concurrency

Questa variabile limita il numero di thread avviati simultaneamente. Il valore da impostare e’ questo

2 * (numero di CPU)

Si imposta nella sezione [mysql] ad es.

[mysqld]
thread_concurrency  = 4

read_rnd_buffer_size

Viene utilizzata a seguito di una query che prevede un ordinamento delle righe, il classico ORDER BY per intenderci.
E’ consigliabile impostare 1Kb per ogni MB di memoria destinata al servizio mysqld.

Si imposta nella sezione [mysql] ad es.

[mysqld]

read_rnd_buffer_size = 256k

tmp_table_size

Il valore associato a questa variabile indica la dimensione massima delle tabelle temporanee create in memoria.
Si riferisce alle tabelle di tipo MyIsam e quando e’ insufficente la tabella verra’ creata sul disco, con conseguente perdita di performance.
Eseguendo questo comando

mysqladmin -uroot -pPASSWORD processlist -i1

si puo’ verificare se ci sono tabelle temporanee gestite lentamente. Se dovesse essere questo il caso, e’ necessario (memoria permettendo) aumentare tmp_table_size

Si imposta nella sezione [mysql] ad es.

[mysqld]

tmp_table_size = 96M

innodb_buffer_pool_size

Come tmp_table_size ma per le tabelle di tipo InnoDB. Si puo’ impostare questo valore pari al 70/80% della memoria dedicata al servizio mysql

skip-innodb

Se non state utilizzando tabelle di tipo innodb, aggiungete questa direttiva nella sezione [mysqld] della configurazione del servizio

Utilizzare la cache per le query

Per abilitare la cache sulle query impostare

query-cache-type = 1

query-cache-size = 16777216

(questo valore e’ espresso in byte)

Adesso nella console di mysql eseguite questo:

show status like ‘%qcache%’;

e guardate il valore di

Qcache_free_memory
Qcache_lowmem_prunes

Qcache_free_memory indica la memoria disponibile che potra’ essere ancora utilizzata per la cache.
Il valore di Qcache_lowmem_prunes viene aumentato ogni qualvolta che viene rimossa una query dalla cache. Se vedete aumentare questo valore molto rapidamente, dovrete aumentare query-cache-size.

N.B. query_cache_limit indica la dimensione massima del risultato di una query. Se viene superato quella query non sara’ inserita nella cache

Per ripulire la cache bastera’ eseguire questo comando dalla console di mysql

RESET QUERY CACHE

Installare mod_fcgid con apache2 in CentOS GNU/Linux

24 dicembre 2009 1 commento

apacheDi default il web server apache esegue gli script php di un sito con l’utente “www-data”. Per permettere ad uno script di memorizzare dati all’interno di una directory, allora i permessi di quest’ultima devono essere settati a 777 oppure il proprietario della cartella deve essere l’utente “www-data”. In questo caso, se sul vostro server web e’ attivo piu’ di un sito internet, allora uno script di un dominio potrebbe modificare i dati di un’altro. Come fare per ovviare a questo problema?  Eseguendo gli script di ogni sito con un utente distinto installando la suexec, mod_fcgid ed utilizzando il php in modalita’ cgi. Piu’ difficile a dirsi che a farsi, bastano difatti pochi comandi e qualche minuto per configurare il tutto:

1) Occorre disabilitare SELinux

setenforce 0

Editare il file /etc/selinux/config ed impostare SELINUX a ‘disable’

SELINUX=disabled

2) Installare mod_fcgid. Questo modulo  non e’ disponibile nel repository ufficiale di CentOS ma possiamo prelevarlo da un’altra fonte

cd /etc/yum.repos.d/
wget http://centos.karan.org/kbsingh-CentOS-Extras.repo

Editare /etc/yum.repos.d/kbsingh-CentOS-Extras.repo ed impostare gpgcheck a 0 ed enabled a 1 nella sezione [kbs-CentOS-Testing]:

[...]
[kbs-CentOS-Testing]
gpgcheck=0
enabled=1
[..]

Eseguire adesso questo comando

yum install mod_fcgid

4)
Commentare tutte le righe del file /etc/httpd/conf.d/php.conf (per evitare che il php venga caricato come modulo), anteponendo il carattere # ad inizio riga

5)
Adesso dovremo forzare il PHP a correggere il percorso del cgi in modo conforme alle specifiche PATH_INFO/PATH_TRANSLATED. Bastera’ aggiungere nel php.ini (/etc/php.ini) questa direttiva:

cgi.fix_pathinfo = 1

6) Creiamo l’utente con cui dovranno essere eseguiti gli script del sito

groupadd sito1
useradd -s /bin/false -d /var/www/sito1 -m -g web1 web1
chmod 755 /var/www/sito1

7) Creiamo la cartella che dovra’ ospitare i file del sito

mkdir -p /var/www/sito1/htdocs
chown sito1:sito1 /var/www/sito1/htdocs

8) Creiamo il wrapper che utilizzeremo per avviare il php e configurare mod-fcgid:

mkdir -p /var/www/fcgid-conf-sito1

9) Inseriamo queste righe nel file /var/www/fcgid-conf-sito1/sito1.conf

#!/bin/sh
export PHPRC=/etc/
export PHP_FCGI_MAX_REQUESTS=400
export PHP_FCGI_CHILDREN=2
exec /usr/bin/php-cgi

PHPRC,PHP_FCGI_MAX_REQUESTS e PHP_FCGI_CHILDREN sono opzionali e se verranno omessi sara’ impostato il valore di default. Sono utili per poter indicare il percorso del php.ini, permettendo cosi’ di utilizzare una configurazione diversa da sito a sito, oppure per definire il numero di child per processo ed il numero di richieste che puo’ gestire prima di terminare.

10) Impostiamo i corretti permessi/proprietario

chmod 755 /var/www/fcgid-conf-sito1/sito1.conf
chown -R sito1:sito1 /var/www/fcgid-conf-sito1

11) Creiamo in /etc/httpd/conf/httpd.conf la configurazione del sito

<VirtualHost *:80>
ServerName www.sito1.it
ServerAdmin postmaster@sito1.it
DocumentRoot /var/www/sito1/htdocs/

<IfModule mod_fcgid.c>
SuexecUserGroup sito1 sito1
PHP_Fix_Pathinfo_Enable 1
<Directory /var/www/sito1/htdocs/>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/fcgid-conf-sito1/sito1.conf .php
Order allow,deny
Allow from all
</Directory>
</IfModule>

# ErrorLog /var/log/apache2/error.log
# CustomLog /var/log/apache2/access.log combined
ServerSignature Off

</VirtualHost>

12) Salvare il file e riavviare il web server

/etc/init.d/httpd restart

Categorie:Altro, Apache, How-to, Server, Sicurezza Tag:

Installare Tomcat su Debian Etch 4.0

13 novembre 2009 Nessun commento

tomcatPer installare tomcat su debian etch è possibile seguire varie strade, in questa guida installaremo tomcat dai repositori non free.

Aprire il file di configurazione dei repository:

vi /etc/apt/source.list

ed aggiungere i seguenti repository

deb http://ftp.debian.org/debian/ etch non-free
deb-src http://ftp.debian.org/debian/ etch non-free

agornare apt con

apt-get update

Installare la java sdk

apt-get install sun-java5-jdk

Per vedere se la java sdk è stata installata correttamente potete lanciare il comando

java -version

Se in output vedrete la versione di java questo risulta installato correttamente.

Dopodichè si può procedere ad installare tomcat:

apt-get install tomcat5.5 tomcat5.5-admin tomcat5.5-webapps

Una volta eseguiti i passaggi tomcat sara attivo e funzionante sul sistema, potrete provarlo connettendovi all’ indirizzo: http://localhost:8180/

vmstat

7 novembre 2009 Nessun commento

Per analizzare le prestazioni di un sistema Unix-like possiamo utilizzare un comando molto utile che ci permette di avere dettagliate informazioni sul nostro sistema, sui processi, sulla memoria, sulla paginazione, sull’I/O: vmstat.

Iniziamo ad analizzare il comando:

vmstat 3 5
procs     memory      —swap– —–io—-     -system– —-cpu—-
r b         swpd free    si    so       bi bo      in cs us sy id wa
1 0        752   156     20 12        44 0       0 58 49 1 3 1

Il comando appena dato esegue 5 rilevazioni ogni 3 secondi.
Sotto procs troviamo :

  • r che indica il numero di processi in attesa del tempo di esecuzione, cioè prossimi all’esecuzione da parte della CPU.
  • b che indica il numero di processi bloccati che sono in attesa di un qualche evento, per esempio delle operzioni di I/O.

Nella colonna memory:

  • swpd indica il quantitativo di memoria virtuale usata (espressa in kB per vederla in MB usare -s m).
  • free rappresenta il numero di kB liberi nel sistema.

E’ interessante osservare che un valore della memoria libera prossima allo zero ed un pesante utilizzo dello spazio swap, nel tempo, indicano che il sistema non sta lavorando correttamente.

Nella colonna Swap troviamo in (kB/s):

  • si rappresenta la quantità di memoria prelevata dalla swap disco.
  • so indica la quantità di memoria swappata sul disco.

Ovviamente un alta attività di questi due parametri, quindi di scrittura e lettura da e sulla swap, sono indicativi di una configurazione della memoria di sistema insufficiente. Un sistema che fa un forte utilizzo della memoria swap molto facilmente tende ad andare in OOM, con conseguente blocco del server.

L’io rappresenta il numero di blocchi inviati ad un device a blocchi (blocchi/s):

  • bi sono i blocchi inviati, quindi scritti su disco.
  • bo riporta i blocchi letti dal disco.

Ovviamente se abbiamo un attività di swap su disco vedremo parecchio movimento anche nella colonna io. Questo in base alla velocità di lettura e scrittura su disco potrebbe creare seri problemi alle prestazioni del nostro server.

Sotto system troviamo:

  • in: Il numero di interrupt al secondo, incluso il clock.
  • cs mostra il numero di cambiamenti di contesto effettuati in un intervallo (cioè il numero di volte in cui il kernel ha scambiato il processo in esecuzione con un altro).

Un valore molto alto di cs indica solitamente un dispositivo hardware configurato male o addirittura malfunzionante.

L’ultima colonna cpu elenca rispettivamente:

  • us: Percentuale di utilizzo CPU da parte di processi in userspace.
  • sy: Percentuale di utilizzo CPU da parte del kernel
  • id: tempo di inattività.
  • wa: Tempo di attesa sull’IO. Ovviamente più è prossimo allo zero e più il sistema tende ad avere prestazioni migliori.