<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Il non-blog di Mario Pascucci &#187; Sotto il cofano</title>
	<atom:link href="http://www.ismprofessional.net/pascucci/index.php/category/linux/sotto-il-cofano/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ismprofessional.net/pascucci</link>
	<description>Sto lavorando sodo per preparare il mio prossimo errore (B. Brecht)</description>
	<lastBuildDate>Tue, 27 Jul 2010 21:29:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>NFS server su Linux + client NFS su SGI IRIX = cose strane</title>
		<link>http://www.ismprofessional.net/pascucci/index.php/2010/03/nfs-server-su-linux-client-nfs-su-sgi-irix-cose-strane/</link>
		<comments>http://www.ismprofessional.net/pascucci/index.php/2010/03/nfs-server-su-linux-client-nfs-su-sgi-irix-cose-strane/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 09:23:03 +0000</pubDate>
		<dc:creator>Mario Pascucci</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sotto il cofano]]></category>
		<category><![CDATA[IRIX]]></category>
		<category><![CDATA[nfs]]></category>

		<guid isPermaLink="false">http://www.ismprofessional.net/pascucci/?p=831</guid>
		<description><![CDATA[Ho ancora per le mani un paio di server Silicon Graphics Origin 200 (roba del 2000, che va ancora senza il minimo problema). Nell&#8217;impianto dove sono impiegati, questi due server montano via NFS uno spazio disco condiviso da un server SUNFire 6800. Arrivato il momento della pensione per il SunFire (le macchine SGI ci andranno [...]]]></description>
			<content:encoded><![CDATA[<p>Ho ancora per le mani un paio di server Silicon Graphics Origin 200 (roba del 2000, che va ancora senza il minimo problema).<br />
Nell&#8217;impianto dove sono impiegati, questi due server montano via NFS uno spazio disco condiviso da un server SUNFire 6800. </p>
<p>Arrivato il momento della pensione per il SunFire (le macchine SGI ci andranno a fine anno), è stato sostituito da un server DL380 di HP, con 5Tb di disco, con installato <a href="http://www.centos.org/">CentOS</a>. </p>
<p>A metà della procedura di sostituzione, controllando che i servizi che girano sul Origin 200 operassero regolarmente, è saltato fuori un problema veramente curioso. Supponiamo che la macchina CentOS esporti una directory chiamata <strong>alfa</strong>, con dentro due directory <strong>beta</strong> e <strong>gamma</strong>. La macchina SGI avrà nel file <strong>/etc/fstab</strong> una riga tipo questa:</p>
<pre><code>centos:/alfa  /puntodimount   nfs  defaults 0 0
</code></pre>
<p>Fin qui nulla di strano. L&#8217;anomalia salta fuori se si entra nella directory <strong>/puntodimount</strong>, e di usa il comando <strong>pwd</strong>:</p>
<pre><code># cd /puntodimount
# pwd
/
#
</code></pre>
<p>la risposta dovrebbe essere invece <strong>/puntodimount</strong>, ossia viene &#8220;eliminato&#8221; percorso di mount dalla directory corrente. Naturalmente in questo frangente tutti i servizi che controllano dove si trovano prima di operare non funzionano più, perché se vogliono andare dentro <strong>/puntodimount/beta</strong>, al controllo di &#8220;dove sono&#8221; (<strong>pwd</strong>), si vedono dentro <strong>/beta</strong>. </p>
<p>Dopo un paio di passaggi con Google ne sono venuto a capo: è un bug noto di IRIX 6.5.12 e precedenti, il numero 815265, la cui criptica definizione è: <em>IRIX not liking file handles of less than 32 bytes</em>. Il bug è risolto nella versione 6.5.13, ma, naturalmente, non è possibile fare alcun aggiornamento della macchina IRIX, meno che mai un aggiornamento di sistema operativo, che porterebbe ben altri problemi.</p>
<p>La soluzione è di usare l&#8217;opzione <strong>vers=2</strong> nel file /etc/fstab del client IRIX, in questo modo:</p>
<pre><code>centos:/alfa  /puntodimount   nfs  defaults,vers=2  0 0
</code></pre>
<p>Risolto questo problema, naturalmente, è uscito fuori quello che stava sotto, più grande: le prestazioni pietose. Per capirci, creando un file da 100M dalla macchina SGI sul server NFS Linux, questo è stato il risultato:</p>
<pre><code># time dd if=/dev/zero of=/LGCACHE/provamario bs=1024000 count=100
100+0 records in
100+0 records out
0.0u 2.0s 5:56 0% 0+0k 3+6250io 0pf+0w
</code></pre>
<p>Tradotto, 5 minuti e 56 secondi per creare il file, ossia 280kb/sec, roba che neanche con una rete a 10 mbit.</p>
<p>Facendo il solito giro, stavolta sui newsgroup, ho trovato un paio di messaggi che spiegano perché e come risolvere. In breve: mentre l&#8217;implementazione di SUN del server NFS lavora bene con l&#8217;impostazione <em>synchronous writes</em>, ossia il server risponde &#8220;ho scritto&#8221; ad ogni richiesta solo dopo che ha effettivamente scritto sul disco i dati, lasciando in attesa il client, l&#8217;implementazione in Linux lavora meglio con l&#8217;impostazione <em>asynchronous writes</em>, dove il server risponde immediatamente &#8220;ho scritto&#8221; alla corretta ricezione dei dati. L&#8217;effetto è che le scritture su disco, in Linux, vengono accumulate ed eseguite a gruppi, eliminando di fatto l&#8217;attesa per il client.<br />
Aggiungendo nel server Linux alla riga di definizione della <em>share</em> NFS nel file <strong>/etc/exports</strong> il parametro <strong>async</strong> si ottiene questo risultato, con lo stesso test di scrittura:</p>
<pre><code># time dd if=/dev/zero of=/LGCACHE/provamario1  bs=1024000 count=100
100+0 records in
100+0 records out
0.0u 1.7s 0:11 15% 0+0k 1+6255io 0pf+0w
</code></pre>
<p>solo 11 secondi, pari a 9,3Mb/sec, un risultato ben diverso da prima.</p>
<h4>Riferimenti</h4>
<ul>
<li><a href="http://tldp.org/HOWTO/NFS-HOWTO/interop.html">Il Linux NFS HOWTO</a>, al paragrafo 8.5.2, dove nomina questo problema specifico, ma tutti i link riportati sono &#8220;rotti&#8221;, quindi non forniscono soluzioni</li>
<li><a href="http://nfs.sourceforge.net/#section_e">Linux NFS FAQ su Sourceforge</a>, al punto E3 riporta la soluzione.</li>
<li>Il messaggio nel newsgroup <a href="http://groups.google.it/group/comp.protocols.nfs/msg/212ecc487e911e16?hl=it">comp.protocols.nfs che spiega il perché delle lentezze della accoppiata Linux/SGI con NFS</a></li>
<li>Il messaggio nel newsgroup <a href="http://http://groups.google.it/group/comp.os.linux.development.system/msg/09c8fc7f1fb309ff?hl=it">comp.os.linux.development.system che mostra un test di confronto su server NFS Linux con e senza l&#8217;opzione async</a></li>
]]></content:encoded>
			<wfw:commentRss>http://www.ismprofessional.net/pascucci/index.php/2010/03/nfs-server-su-linux-client-nfs-su-sgi-irix-cose-strane/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tape drive LTO-3, controller HP Smart Array, Linux e problemi di velocità</title>
		<link>http://www.ismprofessional.net/pascucci/index.php/2009/11/tape-drive-lto-3-controller-hp-smart-array-linux-e-problemi-di-velocita/</link>
		<comments>http://www.ismprofessional.net/pascucci/index.php/2009/11/tape-drive-lto-3-controller-hp-smart-array-linux-e-problemi-di-velocita/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 03:00:32 +0000</pubDate>
		<dc:creator>Mario Pascucci</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sotto il cofano]]></category>
		<category><![CDATA[block size]]></category>
		<category><![CDATA[Controller Smart Array]]></category>
		<category><![CDATA[I/O speed]]></category>
		<category><![CDATA[LTO-3]]></category>
		<category><![CDATA[Tape drive]]></category>

		<guid isPermaLink="false">http://www.ismprofessional.net/pascucci/?p=783</guid>
		<description><![CDATA[Ho per le mani un server nuovo di zecca, con una discreta dotazione hardware. In particolare il pezzo degno di nota è un drive per nastri di tipo LTO-3. Il server è un HP DL380 di sesta generazione, e monta un controller dedicato per il drive a nastro, uno SmartArray P212 con interfaccia di tipo [...]]]></description>
			<content:encoded><![CDATA[<p>Ho per le mani un server nuovo di zecca, con una discreta dotazione hardware. In particolare il pezzo degno di nota è un drive per nastri di tipo LTO-3.</p>
<p>Il server è un HP DL380 di sesta generazione, e monta un controller dedicato per il drive a nastro, uno SmartArray P212 con interfaccia di tipo SAS.</p>
<p>Il primo problema è stato che il drive non è rilevato all&#8217;avvio del sistema operativo, ma questo è facile da risolvere: i controller di tipo Smart Array sono in grado di accettare e controllare dispositivi a nastro, naturalmente a patto che l&#8217;interfaccia sia corretta, ossia SAS o SCSI. Il supporto per i dispositivi SCSI che non siano dischi è normalmente disabilitato nel modulo kernel corrispondente, che per la cronaca si chiama <strong>cciss</strong>, e può essere abilitato senza problemi e senza riavviare niente. Basta usare l&#8217;interfaccia /proc di accesso ai parametri del kernel.<br />
Occorre prima individuare a quale controller sia connesso il drive a nastro, se ce ne sono più di uno. Basta andare a guardare nella directory   <strong>/proc/driver/cciss</strong>: in questa directory vi sono tanti file quanti sono i controller, con il nome <strong>ccissX</strong> dove <strong>X</strong> è il numero &#8220;logico&#8221; del controller. Guardando dentro i singoli file con un cat si individua il controller giusto, nel mio caso è cciss1, il cui contenuto è:</p>
<pre><code>cciss1: HP Smart Array P212 Controller
Board ID: 0x3241103c
Firmware Version: 1.66
IRQ: 178
Logical drives: 0
Sector size: 2048
Current Q depth: 0
Current # commands on controller: 0
Max Q depth since init: 0
Max # commands on controller since init: 1
Max SG entries since init: 0
Sequential access devices: 1
</code></pre>
<p>Per individuarlo, nel mio caso, ho cercato il modello di controller, ma si può usare ad esempio la presenza o meno di dischi, se il controller è condiviso fra dischi e nastro, cosa sconsigliata a priori.<br />
Trovato il controller giusto, basta dare questo comando, da utente root:</p>
<pre><code># echo "engage scsi" > /proc/driver/cciss/cciss1</code></pre>
<p>sostituendo a <strong>cciss1</strong> il file giusto, e magicamente appare il drive a nastro, come si può verificare dai messaggi del kernel, visibili col comando <strong>dmesg</strong>:</p>
<pre><code>scsi0 : cciss
  Vendor: HP        Model: Ultrium 3-SCSI    Rev: Q24D
  Type:   Sequential-Access                  ANSI SCSI revision: 05
scsi 0:0:0:0: Attached scsi generic sg0 type 1
</code></pre>
<p>Per trovare il device, occorre prima caricare a mano il modulo kernel <strong>st</strong>, oppure riavviare, ed a quel punto avremo disponibile il device <strong>/dev/st0</strong> ed il device <strong>/dev/nst0</strong> per accedere al nastro: il primo riavvolge il nastro automaticamente all&#8217;inizio quando si termina una operazione di scrittura (alla chiusura del device, ossia quando ad esempio il comando <strong>tar</strong> termina), mentre il secondo lascia il nastro dov&#8217;è.<br />
Per rendere permanenti le modifiche ed avere il drive disponibile fin dall&#8217;avvio, ho inserito il comando nel file <strong>/etc/rc.local</strong>, che nelle distribuzioni RedHat e derivate (Fedora, CentOS), come pure in Debian, è destinato appunto questo scopo. Come effetto collaterale avremo che il modulo kernel <strong>st</strong> sarà caricato automaticamente all&#8217;avvio. </p>
<h4>La velocità</h4>
<p>Il primo test è a dir poco deludente: meno di 3 megabyte al secondo. Ma l&#8217;effetto peggiore è un altro, a lungo termine: il drive, non avendo dati alla velocità giusta, è costretto a fermarsi, aspettare dati a sufficienza, tornare indietro e ripartire. Questo ciclo di start-stop-rewind è in grado di distruggere un drive in pochi mesi. Se invece i dati arrivano costantemente e in quantità adeguata, il drive scrive a velocità costante per tutto il tempo senza fermarsi mai, se non alla fine del lavoro.<br />
Ebbene, il problema è a vari livelli. La facciamo breve:</p>
<ul>
<li>disattivare la compressione del drive, ed usare quella del software</li>
<li>impostare la dimensione del blocco sul nastro a 64k (65536 bytes)</li>
<li>assegnare al modulo kernel <strong>st</strong> almeno 2 megabyte di buffer</li>
</ul>
<p>dopo questi interventi la velocità in scrittura è passata a 30 megabyte/sec, ben dieci volte, e soprattutto niente più start-stop.</p>
<p>Ecco i comandi da impartire, partiamo dalla compressione:</p>
<pre><code># mt -f /dev/st0 compression off</code></pre>
<p>dove <strong>mt</strong> è una utility per la gestione dei drive a nastro, disponibile nel pacchetto <strong>mt-st</strong>.</p>
<p>Per la dimensione del blocco, si può utilizzare sia il comando:</p>
<pre><code># mt -f /dev/st0 setblk 65536</code></pre>
<p>che con le opzioni proprie del programma usato per scrivere su nastro. Ad esempio <strong>tar</strong> ha l&#8217;opzione <strong>-b</strong> a cui devono essere indicati quanti blocchi da 512 byte per impostare la lunghezza del segmento dati da leggere o scrivere. Per 64k l&#8217;opzione è <strong>-b 128</strong>.</p>
<p>Per il buffer del modulo kernel <strong>st</strong> invece occorre aggiungere questa riga al file <strong>/etc/modprobe.conf</strong> (o l&#8217;equivalente della distribuzione in uso):</p>
<pre><code>options st buffer_kbs=4096</code></pre>
<p>e per attivare le modifiche basta scaricare il modulo, eseguire un <strong>depmod&nbsp;-a</strong> e ricaricare il modulo <strong>st</strong>. Se la configurazione è corretta, nel log del kernel deve apparire qualcosa del genere:</p>
<pre><code>st: Version 20070203, fixed bufsize 4194304, s/g segs 256
st 0:0:0:0: Attached scsi tape st0
st0: try direct i/o: yes (alignment 512 B)
st0: Block limits 1 - 16777215 bytes.
</code></pre>
<p>Notare il messaggio: &#8220;fixed bufsize 4194304&#8243;.</p>
<p>La cura è piuttosto efficace, questo è il risultato di un test eseguito dopo le impostazioni mostrate:</p>
<pre><code># time dd if=/dev/zero of=/dev/st0 bs=64k count=100000
100000+0 records in
100000+0 records out
6553600000 bytes (6,6 GB) copied, 212,13 seconds, 30,9 MB/s

real	3m32.133s
user	0m0.040s
sys	0m1.049s
</code></pre>
<h4>Riferimenti</h4>
<ul>
<li>Il manuale del modulo <strong>st</strong>, contenuto nel pacchetto <strong>kernel-doc</strong>, o nei sorgenti del kernel, in <strong>Documentation/scsi/st.txt</strong>.</li>
<li>Il manuale del modulo <strong>cciss</strong>, sempre nel pacchetto della documentazione del kernel, in <strong>Documentation/cciss.txt</strong>.</li>
<li>Un vecchio articolo della <a href="http://kbase.redhat.com/faq/docs/DOC-7084">knowledge base di RedHat sui controller Smart Array</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.ismprofessional.net/pascucci/index.php/2009/11/tape-drive-lto-3-controller-hp-smart-array-linux-e-problemi-di-velocita/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
