{"id":231,"date":"2016-02-12T17:28:30","date_gmt":"2016-02-12T16:28:30","guid":{"rendered":"http:\/\/eppesuigoccas.homedns.org\/wordpress\/?p=231"},"modified":"2016-02-16T10:38:26","modified_gmt":"2016-02-16T09:38:26","slug":"metti-che-prendi-un-ibm-power8-per-risolvere-tutti-i-tuoi-problemi","status":"publish","type":"post","link":"https:\/\/blog.sguazz.it\/index.php\/archives\/231","title":{"rendered":"Metti che prendi un IBM Power8 per risolvere tutti i tuoi problemi"},"content":{"rendered":"<p>Di recente ho lavorato alla configurazione di un nuovo server baan IV con oracle. Si trattava del passaggio da un cluster con 2 server HP Integrity rx2660 con sistema operativo HP-UX B.11.31 e processore Intel Itanium 2 9140 (2 core, 1,66GHz, 4 logical CPU dovute all&#8217;attivazione dell&#8217;hyper-threading) con 32GB di RAM, ad un cluster con 2 server <a href=\"http:\/\/www-03.ibm.com\/systems\/power\/hardware\/s814\/specs.html\">IBM 8286-41A<\/a> con degli LPAR con sistema operativo AIX 7.1.3.45 TL03 e processore <a href=\"https:\/\/en.wikipedia.org\/wiki\/POWER8\">POWER8<\/a> (6 core dei quali solo 2 abilitati, 3,02GHz, quindi 2 virtual CPU con in tutto 4\/8\/16 logical CPU configurabili con SMT) con 32GB di RAM.<\/p>\n<p>Sul vecchio sistema era utilizzato oracle 10g (10.2.0.4.0 standard edition), sul nuovo \u00e8 stato scelto oracle 12c (12.1.0.1.0 standard edition) perch\u00e9 il vecchio 10g non \u00e8 pi\u00f9 supportato da oracle e non va su AIX 7.1. Come conseguenza dell&#8217;aggiornamento di oracle \u00e8 stato aggiornato anche il <em>porting set<\/em>: dalla serie 6.1c alla 9.0, con conseguente attivazione del driver di baan per oracle in configurazione \u00abcombo\u00bb.<\/p>\n<p><!--more-->Il server HP aveva un ambiente baan+oracle di produzione su una macchina del cluster, e un secondo ambiente baan+oracle di test sulla seconda macchina. Sul nuovo cluster, in un primo momento, \u00e8 stato migrato solo l&#8217;ambiente di produzione configurando il cluster in modo tale che baan e oracle potessero andare su LPAR diverse o sulla stessa. Per questo motivo sul package di baan \u00e8 stata installata anche una oracle home da usare per connettersi via SQL*Net (e tnsnames.ora) al database oracle.<\/p>\n<p>L&#8217;installazione \u00e8 stata fatta mantenendo i due package (oracle e baan) sullo stesso LPAR, ma nei primi giorni di lavoro si \u00e8 capito che il nuovo server era lento, anche parecchio, se confrontato al vecchio. Una serie di analisi dettagliate hanno mostrato che le statistiche usate dall&#8217;ottimizzazione di oracle non erano aggiornate, difatti il job interno di oracle 12 che le aggiorna non era stato attivato. Il calcolo delle statistiche tramite DMBS_STATS.GATHER_SCHEMA_STATS(&#8216;BAAN&#8217;) oppure tramite un ANALYZE TABLE BAAN.T&#8230; forniva lo stesso risultato: le prestazioni diventavano accettabili, ma la macchina era carica al 100% con un runqueue (mostrata da topas) di circa 30. \u00c8 stato allora deciso di spostare il package con oracle sul secondo LPAR, in modo da avere a disposizione il doppio dei processori.<\/p>\n<p>A questo punto nessuna delle macchine era carica al 100%, ma in ogni caso il sistema era lento tanto quanto prima. Per fare un esempio: il job dell&#8217;MRP durava 7 ore contro l&#8217;ora che impiegava sulla macchina HP. Il calcolo costi arrivava quasi a 12 ore contro soli 40 minuti. Oltre alla lentezza nei job, anche l&#8217;utilizzo OLTP mostrava lentezze esasperanti diffuse e generalizzate. Durante queste operazione la macchina non ha mai paginato, la quntit\u00e0 di memoria data ad oracle e chiamata SGA \u00e8 sempre stata di circa 9Gb, la RAM veramente usata dalle applicazioni (secondo lo strumento nmon) \u00e8 stata sempre attorno ai 22-23Gb rispetto ai 32Gb disponibili, l&#8217;I\/O verso lo storage \u00e8 sempre stato ottimo, il cache hit di oracle sempre superiore al 99,5%.<\/p>\n<p>Come mai? Ah, gi\u00e0! Non abbiamo abilitato l&#8217;\u00abarray interface\u00bb di baan.<\/p>\n<p>\u00c8 stata allora abilitata &#8212; limitatamente ad un job daemon &#8212; l&#8217;\u00abarray interface\u00bb: 100 record alla volta sia per la lettura dei record durante le SELECT, sia per l&#8217;invio durante le INSERT. Il dettagli dei nuovi parametri \u00e8:<br \/>\nora_init:0101000<br \/>\nora_max_array_fetch:100<br \/>\nora_max_array_insert:100<br \/>\nrds_full:100<br \/>\nssts_set_rows:100<br \/>\ninoltre sono stati impostati\u00a0STU e DTU da 8192 byte nel tnsnames.ora nonostante l&#8217;MTU sia sempre stato di 1500 byte.<\/p>\n<p>Purtroppo, con l&#8217;array interface, i tempi non sono cambiati di una virgola.<\/p>\n<p>Come mai? In effetti spulciando meglio tutta la documentazione relativa ai parametri SDU e TDU, si scopre che il beneficio nell&#8217;incrementarli si ha solo su linee lente, tipo la token ring, o la 10mbit\/s, ma qui le due LPAR sono collegate su uno <em>switch<\/em> da 1gbit\/s full duplex che vanifica l&#8217;utilizzo di SDU e TDU. Si potrebbe provare ad attivare i <em>jumbo frame<\/em> e aumentare l&#8217;MTU, ma questo comporta la riconfigurazione dello <em>switch<\/em> che non \u00e8 immediata e non ha la certezza dell&#8217;incremento delle prestazioni. Invece l&#8217;\u00abarray interface\u00bb diminuisce veramente il numero dei <em>roundtrip<\/em>, quindi deve per forza aver portato un miglioramento delle prestazioni, ma evidentemente questo non \u00e8 percepibile a causa di altri problemi decisamente maggiori.<\/p>\n<p>A questo punto \u00e8 stato eseguito il job dell&#8217;MRP con il <em>profiler<\/em> (Call Graph Profiler, CGP) di baan attivo. La documentazione dice che \u00e8 disponibile solo su LN, ma non \u00e8 vero: \u00e8 disponibile solo con il <em>porting set<\/em> di LN, ma poich\u00e9 qui usiamo il porting set di LN con baan IV, allora lo possiamo utilizzare. Oltre al CGP, \u00e8 stato attivato anche l&#8217;SQL_TRACE in modo da avere tutte le misurazioni possibili sia lato baan che lato oracle. Il job \u00e8 durato 2 ore in pi\u00f9 a causa della profilazione, ma ha mostrato una grande discrepanza nei tempi che baan cataloga\u00a0come\u00a0attesa dei dati da oracle, e quelli che oracle sostiene di avere veramente impiegato. Se baan attende in tutto 7 ore da oracle, ma oracle sostiene di avere impiegato in tutto 40 minuti, allora il problema sta nel tempo impiegato nella comunicazione tra i due: baan attende che la sua richiesta vada ad oracle, che oracle produca dei risultati, che questi risultati tornino a baan; invece nel conto di oracle c&#8217;\u00e8 il tempo dall&#8217;arrivo della richiesta di baan fino al momento dell&#8217;invio dei risultati. <em>La differenza \u00e8 il tempo di trasporto delle richieste e dei risultati.<\/em><\/p>\n<p>Chiarito questo, \u00e8 stato ipotizzato che il colpevole fosse SQL*Net, cio\u00e8 il protocollo di rete di oracle. L&#8217;alternativa ad SQL*Net \u00e8 BEQ, che per\u00f2 funziona solo su IPC e non su TCP\/IP. quindi, per passare a BEQ \u00e8 stato portato il package di oracle sulla stessa LPAR di baan ed \u00e8 stato riconfigurato baan per comunicare tramite BEQ cio\u00e8: ORACLE_SID al posto di ORACLE_SERVICE_NAME e utilizzo della stessa oracle home dell&#8217;istanza.<\/p>\n<p>Alla connessione degli utenti baan ad oracle si sono avuti gli errori ORA-01116 \u00aberror in opening database file\u00bb. Questo problema \u00e8 dovuto al fatto che i <em>datafile<\/em> di oracle sono adesso aperti dai processi client di utenti baan (del gruppo unix bsp), mentre prima tutti i file erano aperti dall&#8217;utente AIX oracle. Perch\u00e9 quest&#8217;ultimo potesse utilizzare <em>datafile<\/em> pi\u00f9 grandi di 2Gb, gli sono state alzate le soglie massime in <em>\/etc\/security\/limits.conf<\/em>, ma adesso i processi degli utenti baan non riescono ad aprire quei file perch\u00e9 la loro soglia \u00e8 minore. Per risolvere questo problema, poich\u00e9 non \u00e8 possibile su AIX impostare i limiti per un gruppo (ad esempio, su Linux, si sarebbe potuto utilizzare il nome \u00ab@bsp\u00bb per assegnare i limiti a tutto il gruppo bsp) si \u00e8 deciso di aumentare i limiti predefiniti di tutti gli utenti, equiparandoli a quelli precedentemente assegnati ad oracle. A quel punto \u00e8 stato possibile collegarsi da baan ad oracle senza errori.<\/p>\n<p>I tempi di esecuzione dei job sono tornati minimi: con l&#8217;\u00abarray interface\u00bb l&#8217;MRP gira in 45 minuti, il calcolo costi in 28 minuti (quest&#8217;ultimo ha impiegato 10 minuti di CPU nel processo audit_srv poich\u00e9 la tabella degli articoli \u00e8 sotto audit). Quindi la differenza tra SQL*Net e BEQ si \u00e8 rivelata effettivamente enorme.<\/p>\n<p>Nell&#8217;utilizzo durante la giornata, con pochi job e parecchi utenti, la macchina non sembrava particolarmente veloce e neppure lenta, ma era sempre carica al 100%. Per poter lavorare con un minimo di margine \u00e8 stato proposto di attivare un terzo core della CPU, ma in questo caso si avrebbero avuti due problemi: il primo \u00e8 che il costo delle licenze oracle standard edition sarebbero aumentate di 25000\u20ac, il secondo \u00e8 che per poter aggiornare oracle alle prossime versioni \u00e8 necessario passare gratuitamente alla standard edition two (SE2), oppure a pagamento alla enterprise edition, ma la SE2 impone il limite di 2 core e di 16 thread. Quindi l&#8217;abilitazione di un terzo core \u00e8 una opzione scartata perch\u00e9 troppo costosa.<\/p>\n<p>Come alternativa \u00e8 stato modificato il numero di processori logici: l&#8217;LPAR ha assegnati due core, che dentro l&#8217;LPAR sono visti come CPU virtuali, che sono poi divisi in CPU logiche. Fino ad ora la divisione era in quarti: ogni CPU virtuale era divisa in 4, ma il power permette anche la divisione in 2 o in 8 diversi <em>thread hardware<\/em>. Sono quindi state fatte delle prove e si \u00e8 visto che utilizzando la configurazione SMT8 (cio\u00e8 8 thread hardware per ciascuno dei due core della CPU, arrivando ad un parallelismo totale di 16) il sistema non era pi\u00f9 costantemente carico al 100%, ma aveva un minimo di margine aggiuntivo che durante l&#8217;orario lavorativo era tra il 2 e il 7% (idle), mentre quando gli utenti italiani non lavoravano e restavano solo quelli stranieri (una quarantina compresi i job daemon), si arrivava al 10-20% di idle.<\/p>\n<p><em>Come funziona, a grandi linee, questa cosa\u00a0del numero di thread hardware<\/em>: il singolo core del POWER8 \u00e8 composto da vari componenti hardware che possono essere utilizzati per \u00a0\u00abcomporre\u00bb 2, 4\u00a0o 8\u00a0CPU\u00a0logiche. L&#8217;hardware \u00e8 sempre lo stesso, quindi se lo divido in 4 (configurazione SMT4), avr\u00f2 delle CPU logiche che al massimo avranno 1\/4 della potenza totale del core; se lo divido in 8 (configurazione SMT8) allora ogni CPU logica avr\u00e0 la met\u00e0 della potenza che avrebbe in SMT4, cio\u00e8 1\/8 della potenza totale del core.<\/p>\n<p><em>Come funziona la richiesta di potenza di calcolo di un normale processo baan<\/em>: la bshell, cio\u00e8 il processo del sistema operativo che contiene la logica di baan, esegue le sessioni di baan. Quando deve accedere al database, fa la richiesta ad oracle e attende la risposta. A quel punto sul sistema operativo la bshell non chiede pi\u00f9 CPU, che viene invece richiesta dal processo oracle (che nella nostra configurazione \u00e8 DEDICATED e non MTS, cio\u00e8 c&#8217;\u00e8 un processo oracle per ogni bshell). Quando oracle termina, restituisce alla bshell il risultato e non richiede pi\u00f9 la CPU. A quel punto la bshell viene svegliata e riprende l&#8217;elaborazione con la CPU. Morale: pur avendo vari processi del sistema operativo, solo uno \u00e8 attivo in un determinato momento, quindi un utente baan (o un job daemon) richiede al sistema esattamente una CPU.<\/p>\n<p>Chiarito come funzionano SMT e la richiesta di CPU, vediamo i due scenari OLTP e batch:<\/p>\n<ul>\n<li>durante la giornata ci sono decine di utenti collegati al sistema, e ciascuno di essi richiede la CPU per una semplice e veloce transazione (OLTP). AIX assegna la prima cpu logica libera alla bshell e ad oracle alternativamente. Poich\u00e9 gli utenti sono decine, potrei utilizzare decine di CPU. In SMT4 il sistema aveva 4 CPU\u00a0logiche per ciascuno dei due core, quindi con 8 CPU si vedeva che la macchina era satura al 100%. Difatti la percentuale TOTALE di CPU idle era 0. Invece, una volta configurato il processore in SMT8, il sistema AIX vedeva 16 CPU logiche, ma evidentemente le decine di utenti collegate al sistema non richiedevano la CPU con un grado di parallelismo 16, e quindi AIX poteva risparmiare un processore mostrando il sistema con un idle TOTALE del 7% che &#8212; guarda caso &#8212; \u00e8 circa\u00a01\/16 di processore;<\/li>\n<li>durante la notte il sistema si trasforma da OLTP a batch: non ci sono decine di utenti collegati, ma solo due job daemon, dei quali solo uno\u00a0con i job impegnativi. Allora il lavoro notturno richiede una sola CPU. Nella configurazione in SMT4, i tempi di esecuzione dell&#8217;MRP e del calcolo costi era scesi a 3\/4 dei corrispondenti tempi sulla macchina HP-UX. Ma poich\u00e9 non c&#8217;erano altri processi a richiedere la CPU, il sistema mostrava una CPU al 100% e le altre 7 idle. Cio\u00e8 il job stava sfruttando appieno una delle CPU logiche su un core in SMT4, cio\u00e8 usava appieno il 25% di un core. Una volta riconfigurata la CPU in SMT8, lo stesso job ha usato la CPU logica al 100% lasciando le altre 15 CPU idle, vale a dire che ha usato al massimo 1\/8 di core. E difatti, in SMT8, i tempi d&#8217;esecuzione dei job sono pi\u00f9 che raddoppiati rispetto a SMT4: l&#8217;MRP dura circa 2 ore al posto di 45 minuti, il calcolo costi \u00a01 ora e 45 al posto di 30 minuti. I tempi avrebbero dovuto solo raddoppiare, ma evidentemente le varie configurazioni SMT non seguono un andamento lineare.<\/li>\n<\/ul>\n<p>Chiarito quindi che l&#8217;aver visto un po&#8217; di CPU idle in SMT8 \u00e8 stato solo un caso dovuto al fatto che in quel momento non era richiesto dal sistema un grado di parallelismo di 16, viene da pensare che in SMT8, poich\u00e9 il 7% della CPU non era usata, gli altri 15 utenti che veramente stavano lavorando andassero leggermente pi\u00f9 piano, difatti non potevano sfruttare quel 7%. Ma evidentemente la sensazione dell&#8217;utente non \u00e8 cos\u00ec sensibile da accorgersene.<\/p>\n<p>La soluzione finale sembra quella di\u00a0configurare la macchina in SMT2: in questo modo i job dovrebbero andare a oltre il doppio della velocit\u00e0 vista su HP-UX, e durante il giorno, AIX sar\u00e0 in grado di assegnare tutta la potenza di calcolo ai vari utenti OLTP.<\/p>\n<p>Beh, alla prova dei fatti, non \u00e8 andata proprio come da aspettative: durante la prima esecuzione l&#8217;MRP ha girato nello stesso tempo in SMT2 e in SMT8. Vediamo come andr\u00e0 nei prossimi giorni.<\/p>\n<p>Lezioni imparate:<\/p>\n<ol>\n<li>evitare SQL*Net come la morte;<\/li>\n<li>evitare TCP\/IP in locale;<\/li>\n<li>il processore IBM POWER8 a 3HGz del 2014 in SMT4 non ha una potenza di calcolo maggiore dell&#8217;Intel Itanium 2 a 1,66GHz del 2007 se misurata per singola CPU logica;<\/li>\n<li>le licenze oracle costano un botto;<\/li>\n<li>lo unix di IBM &#8212; AIX &#8212; \u00e8 il peggiore di tutti e non ha neppure la possibilit\u00e0 di assegnare i limiti per gruppo.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Di recente ho lavorato alla configurazione di un nuovo server baan IV con oracle. Si trattava del passaggio da un cluster con 2 server HP Integrity rx2660 con sistema operativo HP-UX B.11.31 e processore Intel Itanium 2 9140 (2 core, 1,66GHz, 4 logical CPU dovute all&#8217;attivazione dell&#8217;hyper-threading) con 32GB di RAM, ad un cluster con [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,3],"tags":[],"class_list":["post-231","post","type-post","status-publish","format-standard","hentry","category-sysadmin","category-computer"],"_links":{"self":[{"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/posts\/231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/comments?post=231"}],"version-history":[{"count":8,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/posts\/231\/revisions"}],"predecessor-version":[{"id":244,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/posts\/231\/revisions\/244"}],"wp:attachment":[{"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/media?parent=231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/categories?post=231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/tags?post=231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}