Visualizzazione post con etichetta performance. Mostra tutti i post
Visualizzazione post con etichetta performance. Mostra tutti i post

martedì 26 gennaio 2016

MongoDB Script per current operations

Script molto utile per analizzare le operazioni in esecuzione sul Mongo Server.

Ottimo per prevedere la creazione di eventuali indici senza utilizzare il profile standard.



risultato:

on:<dbname>.<collectionname>
time:12968
query: {"_id":{"str":"54b64c9ee4b009e7c6df0f40"}}

on:<dbname>.<collectionname>
time:18489
query: {"_id":{"str":"54b64c9ee4b009e7c6df0f40"}}

on:<dbname>.<collectionname>
time:131
query: {"field1":"515c785c9ccb3d8e563baf32","field2":"AAA","field1":"BBB"}

lunedì 19 ottobre 2015

MongoDB v.3 Memory Problem

Utilizzando un piccolo server (magari con più processi di mongod ) è possibile che per mancanza di risorse il processo venga killato dal SO.

Nel var/log/messages si trova questa cosa devastante...

Oct 15 02:00:33 <servername> kernel: [723954.577468] Out of memory: Kill process 18100 (mongod) score 368 or sacrifice child

la soluzione è semplicemente dosare correttamente la cache del wiredTiger nel file di configurazione


nel mio caso con un server (debian 8.1 con 16Gb di Ram) con 3 mongod in esecuzione in replica secondaria il parametro è settato a 3Gb per ogni mongod.

dopo una taratura i mongod non crollano più.



 





mercoledì 4 febbraio 2015

MongoDB - Script di compact per tutto il server

Questo script esegue la compact su tutte le collection per tutti i db di tutto il server.

mongo --host <servername> compact.js

utile quando si prova a risparmia  spazio su disco anche se non è sempre detto che funzioni...








giovedì 13 novembre 2014

MongoDB - Script per profile su tutto il server

Abilita il profile per tutti i db del mongo server esclusi local e admin.


per interrogare tutti i profile con l'elenco delle ultime 5 query che superano i 5 millis

lunedì 21 luglio 2014

MongoDB - Script to check Collections Size

Script di utils per recuperare la collection size di ogni db del vostro mongo.

da lanciare con: mongo mongo check_collection_size.js

permette di ottenere la size delle collection di tutti i db in modo da poterla monitorare con qualche app tipo jmeter o nagios.

il risultato:


[ {
"name" : "meteoArpa",
"collections" : [
{
"name" : "data",
"storageSize" : "680.00 KB",
"size" : "510.89 KB",
"count" : 519
},
{
"name" : "pluvio",
"storageSize" : "21.46 MB",
"size" : "19.97 MB",
"count" : 20779
},
{
"name" : "system.indexes",
"storageSize" : "8.00 KB",
"size" : "336 B",
"count" : 3
},
{
"name" : "temperature",
"storageSize" : "21.46 MB",
"size" : "20.00 MB",
"count" : 20807
}
]
},
{
"name" : "pcat",
"collections" : [
{
"name" : "products",
"storageSize" : "8.00 KB",
"size" : "3.58 KB",
"count" : 11
},
{
"name" : "system.indexes",
"storageSize" : "8.00 KB",
"size" : "112 B",
"count" : 1
}
]
},
{
"name" : "admin",
"collections" : [ ]
}
]





mercoledì 1 maggio 2013

MongoDB Index


Visualizzare gli indici presenti sul db

use test;
db.system.indexes.find();

Visualizzare gli indici presenti sulla colection

db.<collection_name>.getIndexes()

Crea l' indice univoco eliminando le chiavi duplicate

db.accounts.ensureIndex( { username: 1 }, { unique: true, dropDups: true )

Creare un indice su elementi che possono anche non esserci nell'elenco dei documenti

db.addresses.ensureIndex( { "size": 1 }, { unique: true, sparse: true } )

Index Size

db.<collection_name>.indexSize();

Forzare l'uso di uno specifico indice

db.users.find().hint( { age: 1 } )

Elimina l'uso degli indici

db.people.find().hint({$natural:1})
Note:
  • l'indice _id per default è sempre univoco anche se non specificato sulla getIndexes()
  • L'indice di default viene creato di tipo BTREE
  • In caso di utilizzo di query su indice sparse le query default non ritornano i documenti che non posseggono quel field.




sabato 2 marzo 2013

MongoDB - Rename Database

Non è possibile rinominare un database di mongo. Il metodo possibile è copiare il db e poi eliminare quello vecchio.

db.copyDabatase("original","newdb","localhost");

use original;
db.dropDatabase();

se abbiamo db molto grosso dobbiamo tenere conto della necessità di parecchio spazio su disco per eseguire l'operazione.

lunedì 2 aprile 2012

MongoDB - Profile and Java


Monitorare le eventuali operazioni sul db che possono creare ritardi è fondamentale per il buon funzionamento di una app.

Per abilitare il Profile è necessario eseguire queste funzionalità dalla console. (mongo)

use <dbname>
db.setProfilingLevel(2); 

ottimo e utile, tutte le query vengono memorizzate nella collection <dbname>.system.profile.

Allargo la colletion di tipo capped per avere più info memorizzate.

//fermo il profile
db.setProfilingLevel(0); 

//drop della collection con il profile
db.system.profile.drop(); 

//creo la nuova collection per uso del profile
db.createCollection("system.profile", {capped:true, size:8000000});

db.system.profile.stats();

db.setProfilingLevel(2); 


A questo punto scrivo questa breve query che:
- ricerca tutte le operazioni superiori a 5 millisecondi
- esclude le query eseguite sul profile (questa!!)
- estraggo solo le operazioni di query (insert/update/delete/ etc.)


db.system.profile.find( { op:"query", millis : { $gt : 5 },ns : { $ne : (db + '.system.profile') } },{ ts:1,millis:1, nscanned:1, nreturned:1, ns:1, op:1, query:1} ).sort({ts:-1})



nel caso in cui "nscanned" sia molto maggiore del parametro "nreturned" allora verifico gli indici sugli object elaborati.

see http://www.mongodb.org/display/DOCS/Database+Profiler


e in java? come posso monitorare la cosa?




package mongodbcheckprofile;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import java.io.IOException;

/**
 * use ; 
 * db.setProfilingLevel(0);
 * db.system.profile.drop()
 * db.createCollection("system.profile", {capped:true, size:8000000})
 * db.system.profile.stats()
 * see http://www.mongodb.org/display/DOCS/Database+Profiler
 * Query utils:  
 * db.system.profile.find( { millis : { $gt : 1 },ns : { $ne : 'nome_db.system.profile' } },{ millis:4, nscanned:1, nreturned:1, ns:1, op:1, query:1} )
 * nel caso: che "nscanned" (molto maggiore) "nreturned"  allora verificare gli indici sugli object elaborati.
 *
 * @author marco
 */
public class MongoDBCheckProfile {

    static String host = "192.168.0.220";
    static int port = 27017;
    static String db_name = "nome_db";
    static String op = "query";
    static int maxtime = 4;
    static int sleep = 5000;

    public static void main(String[] args) throws IOException, InterruptedException {

        while (true) {
            System.out.println("start: " + System.currentTimeMillis());
            Mongo m = new Mongo(host, port);
            DB db = m.getDB(db_name);
            BasicDBObject query = new BasicDBObject();
            DBCollection coll = db.getCollection("system.profile");
    

            query.put("millis", new BasicDBObject("$gt", 4));
            query.put("ns", new BasicDBObject("$ne", db_name + ".system.profile"));
            query.put("op", op);
            DBCursor cur = coll.find(query);
            

            while (cur.hasNext()) {
                DBObject  db_obj = cur.next();
                System.out.println(db_obj.get("ts") + " - " + db_obj.get("ns") + " - " + db_obj.get("nscanned") + "/" + db_obj.get("nreturned") + " millis :" + db_obj.get("millis"));

            }

            Thread.sleep(sleep);

            m.close();

        }


    }
}


martedì 4 ottobre 2011

MongoDB query e qualche test con indici

Utilizzando il db precedentemente creato eseguo qualche query per verificare la velocità:

db.freedb.disk.find({"artist":"Porcupine Tree"}).skip(0).limit(0)

324 risultati
92,81 secondi

Eseguo nuovamente la query precedente ed ottengo gli stessi tempi, quindi non si è creato una cache per la query.

Eseguo la stessa operazione dal codice java:



package freedbtoMongoDb;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.Mongo;

public class Queries {

    static String host = "mongodb1";
    static int port = 27017;
    static String db_name = "freedb";

    public static void main(String[] args) {

        try {

            Mongo m = new Mongo(host, port);

            DB db = m.getDB(db_name);
            DBCollection coll = db.getCollection("disk");

            BasicDBObject query = new BasicDBObject();
            long t1 = System.currentTimeMillis();
            query.put("artist", "Porcupine Tree");


            DBCursor cur = coll.find(query).limit(0).skip(0);
            long t2 = System.currentTimeMillis();
            System.out.println("Tot time Find: " + (t2 - t1));

            while (cur.hasNext()) {
                System.out.println(cur.next());
            }
            long t3 = System.currentTimeMillis();
            System.out.println("Tot time cursor: " + (t3 - t2));

            m.close();

        } catch (Exception e) {

            System.out.println("Exception :" + e.getMessage());
        }
    }
}


Ottengo i seguenti risultati suddivisi per farte di find e retrive dei dati, da quello che si nota la lentezza è nel periodo di retrive dei dati.





Tot time Find: 2
{ "_id" : { "$oid" : "4e846f2330042d8d3130aad3"} , "id" : "blues_480f5d06" , "filename" : "blues/480f5d06" , "revision" : "7" , "title" : "The Sky Moves Sideways" , "genre" : "Rock" , "artist" : "Porcupine Tree" , "length" : "3935" , "year" : "1995" , "extd" : "YEAR: 1995 ID3G: 17" , "tracks" : { "3" : { "title" : "Prepare Yourself"} , "2" : { "title" : "The Moon Touches Your Shoulder"} , "1" : { "title" : "Dislocated Day"} , "0" : { "title" : "The Sky Moves Sideways (phase one)"} , "5" : { "title" : "The Sky Moves Sideways (phase two)"} , "4" : { "title" : "Moonloop"}}}}
etc..
etc..

Tot time cursor: 61270 (1 minuto abbondante)
BUILD SUCCESSFUL (total time: 1 minute 2 seconds)

adesso provo a restringere la query su determinati campi, ad esempio sul nome dell'album (field title).

db.freedb.disk.find({"artist":"Porcupine Tree"}, {title:1}).skip(0).limit(0)

con il terminale stesso risultato precedente:


324 risultati
92,81 secondi
con il seguente codice java:


package freedbtoMongoDb;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.Mongo;

public class Queries {

    static String host = "mongodb1";
    static int port = 27017;
    static String db_name = "freedb";

    public static void main(String[] args) {

        try {

            Mongo m = new Mongo(host, port);

            DB db = m.getDB(db_name);
            DBCollection coll = db.getCollection("disk");

            BasicDBObject query = new BasicDBObject();


            query.put("artist", "Porcupine Tree");

            BasicDBObject field = new BasicDBObject();
            field.put("title", "1");

            long t1 = System.currentTimeMillis();
            DBCursor cur = coll.find(query, field).limit(0).skip(0);
            long t2 = System.currentTimeMillis();
            System.out.println("Tot time Find: " + (t2 - t1));

            while (cur.hasNext()) {
                System.out.println(cur.next());
            }
            long t3 = System.currentTimeMillis();
            System.out.println("Tot time cursor: " + (t3 - t2));

            m.close();

        } catch (Exception e) {

            System.out.println("Exception :" + e.getMessage());
        }
    }
}





Risultato:

Tot time Find: 1
{ "_id" : { "$oid" : "4e846f2330042d8d3130aad3"} , "title" : "The Sky Moves Sideways"}
{ "_id" : { "$oid" : "4e846f2330042d8d3130add5"} , "title" : "The Sky Moves Sideways"}
{ "_id" : { "$oid" : "4e846f2330042d8d3130bb1a"} , "title" : "The Sky Moves Sideways"}
{ "_id" : { "$oid" : "4e846f5830042d8d3134caaa"} , "title" : "BBC Sessions 1993 & 1995"}
{ "_id" : { "$oid" : "4e846faa30042d8d31379b9d"} , "title" : "XM ReTracked"}
{ "_id" : { "$oid" : "4e846fba30042d8d3138cc14"} , "title" : "Lightbulb Sun"}
etc.
etc.
etc.
Tot time cursor: 73556
BUILD SUCCESSFUL (total time: 1 minute 14 seconds)



Le tempistiche si mantengono molto vicine al precedente test anche con l'estrazione di un singolo campo.

A questo punto creo un indice semplice sul campo artist.

Eseguo nuovamente i test precedenti.

il primo:


console:
db.freedb.disk.find({"artist":"Porcupine Tree"}).skip(0).limit(0)

324 risultati tempo 0,01 s

in java:


Tot time cursor: 557

il secondo:


console:
db.freedb.disk.find({"artist":"Porcupine Tree"}, {title:1}).skip(0).limit(0)



324 risultati tempo 0,00 s

in java:

Tot time cursor: 63

diciamo che gli indici aiutano parecchio....



[sorgenti in NetBeans]



giovedì 29 settembre 2011

FreeDB to MongoDB


Ultimamente mi trovo a lavorare con MongoDB, ed ecco subito un test di import di massa scritto in java per testare le tempistiche di import e Query del db.

Come al solito utilizzo il freedb, trasformo tutti il db in un succoso file json da 800MB con la classe FreeDbToJson (progetto completo linkato al fondo del post).

questa è una riga del json:

{
   "id":"soundtrack_fe13d011",
   "filename":"soundtrack/fe13d011",
   "revision":"0",
   "title":"100 Love Songs Stage 4 Cd4",
   "genre":"Soundtrack",
   "artist":"IndianDigitalAudio.com",
   "length":"5074",
   "year":"2011",
   "extd":"",
    "tracks":{
              "15":{"title":"Mausam Achanak"},
              "16":{"title":"I Dont Know What To Do"},
              "13":{"title":"Aaja Maahi"},
              "14":{"title":"Janeman"},
              "11":{"title":"Roshan Dil Ka Jahan"},
              "12":{"title":"Yaad Teri Aaye"},
             "3":{"title":"Jo Ghumshuda"},
              "2":{"title":"Dhadke Jiya"},
              "1":{"title":"Nazrein Karam"},
              "10":{"title":"Tum Bhi Ho Wahi"},
             "0":{"title":"Aao Milo Chalo"},
              "7":{"title":"Mausam"},
              "6":{"title":"Mera Pehla Pehla Pyaar"},
              "5":{"title":"Raat Ke Dhai Baje"},
              "4":{"title":"Jaane Tu Meri Kya Hai"},
              "9":{"title":"Pyaar Ki Yeh Kahani"},
              "8":{"title":"Miss You Everyday"}
  }

}
Dopo aver ottenuto questo file eseguo un'altro piccolo programmino in java per importare di massa tutti i record utilizzando la funzionalità requestStart().


package freedbtoMongoDb;

import com.mongodb.DB;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.util.JSON;
import java.io.IOException;

public class JsonToMongoDB {

    static String host = "hostname";
    static int port = 27017;
    static String db_name = "freedb";
    static String target_folder = "/marco/mongodb/file/";

    public static void main(String[] args) throws IOException {

        Mongo m = new Mongo(host, port);
        DB db = m.getDB(db_name);
        db.requestStart();

        System.out.println("File: " + target_folder + "disk.json");
       BigFile file = null;
        try {
            file = new BigFile(target_folder + "disk.json");
        } catch (Exception ex) {
            System.out.println("exception: " + ex.getMessage());
        }

        long ts = System.currentTimeMillis();
        int i = 0;
        for (String line : file) {
            db.getCollection("disk").insert((DBObject) JSON.parse(line));
            System.out.println("line: " + i);
            i++;
        }

        System.out.println("tot time: " + (System.currentTimeMillis() - ts));
        db.requestDone();

    }
}

il db mongo server è installato su una vm dedicata invece il programma sopra gira in locale in netbeans, le tempistiche sono state:  - tot time: 959532 ( circa 16 minuti) per 3057298 righe inserite.

[sorgenti]

lunedì 2 maggio 2011

OrientDB - Metodi di scrittura: ODocument e Pojo (Embedding in java) - #2

altre puntate: #1

prelevo un file di 10 mb da questo sito per avere dei dati di test per provare le performace di scrittura di questo db, ovvero prendo una classe la aggiungo ad un document e salvo il tutto.

Il file era troppo piccolo quindi lo copia e incollato su se stesso diverse volte ottenendo circa 720000  righe (adesso il mio file pesa 52 MB circa).

metoto ODocument con la classe ODatabaseDocumentTx

ecco il codice:


package orientdbtest;

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.metadata.security.OUser;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.server.OServer;
import com.orientechnologies.orient.server.OServerMain;
import java.io.File;

public class Main {

    public static class GeoIp {

        String from;
        String to;
        Long lat;
        Long lng;
        String country;
        String state;

        public void setFrom(String from) {
            this.from = from;
        }

        public void setTo(String to) {
            this.to = to;
        }

        public void setCountry(String country) {
            this.country = country;
        }

        public void setState(String state) {
            this.state = state;
        }

        public String getFrom() {
            return from;
        }

        public String getTo() {
            return to;
        }

        public String getCountry() {
            return country;
        }

        public String getState() {
            return state;
        }

        public Long getLng() {
            return lng;
        }

        public Long getLat() {
            return lat;
        }

        public void setLng(Long lng) {
            this.lng = lng;
        }

        public void setLat(Long lat) {
            this.lat = lat;
        }
    }

    public static void main(String[] args) {
        try {

            String base = "/home/marco/Scrivania/orientdb/";

            OServer server = OServerMain.create();
            server.startup(new File(base + "/file/conf.xml"));

            ODatabaseDocumentTx db = new ODatabaseDocumentTx("local:" + base + "/db").create();


            try {


                for (String s : db.getClusterNames()) {
                    System.out.println("name: " + s + " - " + db.countClusterElements(s));

                }

                db.begin();


                BigFile geoip_list = new BigFile(base + "/file/data/GeoIPCountryWhois.csv");


                long time = System.currentTimeMillis();


                long c = 0;
                for (String geoip_row : geoip_list) {
                    geoip_row = geoip_row.replaceAll("\"", "");
                    String[] s = geoip_row.split("\\,");
                    GeoIp geoIp = new GeoIp();
                    geoIp.setFrom(s[0]);
                    geoIp.setTo(s[1]);
                    geoIp.setLat(new Long(s[2]));
                    geoIp.setLng(new Long(s[3]));
                    geoIp.setCountry(s[4]);
                    geoIp.setState(s[5]);

                    ODocument doc = new ODocument(db);
                    doc.field("geoIp", geoIp);
                    doc.save();
                    if(c>10000 && c % 10000 == 0)
                        System.out.println(c);
                    c++;
                }



                db.commit();
                System.out.println("tot time: " + (System.currentTimeMillis() - time));
                System.out.println("commit:" + c);


            } catch (Exception e) {
                System.out.println("e:" + e.getMessage() + e.getStackTrace().toString());
                db.rollback();
            } finally {


                for (String s : db.getClusterNames()) {
                    System.out.println("name: " + s + " - " + db.countClusterElements(s));

                }

                db.close();
            }

            server.shutdown();
        } catch (Exception ex) {
            System.out.println("ex:" + ex.getMessage()+ ex.getStackTrace().toString());
        }


    }
}



qui la classe BigFile

lancio il tutto da console per evitare di usare troppa ram dalla ide visto che leggo il file con un iterator.

java -jar "/home/marco/netbeans-project/OrientDbTest/dist/OrientDbTest.jar" 

2011-04-29 05:29:02:098 INFO [OServer] OrientDB Server v1.0rc1-SNAPSHOT is starting up...
2011-04-29 05:29:07:325 INFO [OServerNetworkListener] Listening binary connections on 0.0.0.0:2424
2011-04-29 05:29:12:331 INFO [OServerNetworkListener] Listening http connections on 0.0.0.0:2480
2011-04-29 05:29:12:331 INFO [OServer] OrientDB Server v1.0rc1-SNAPSHOT is active.name: internal - 4
name: index - 0
name: default - 0
name: orole - 3
name: ouser - 3
20000
30000
40000
...
...
...
690000
700000
710000
tot time: 39482
commit:719600
name: internal - 4
name: index - 0
name: default - 719600
name: orole - 3
name: ouser - 3



...non male!!! inserite 719600 righe in 39 secondi tutto embeddato in un jar sul pc client....

se utilizzo il metodo POJO, ovvero OrientDB mappa la classe e salvo direttamente la classe mappata il tutto diventa molto più lento (forse perchè deve ricostruire tutto l'object in fase di salvataggio).

metodo POJO con la class ODatabaseObjectTx


package orientdbtest;

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.db.object.ODatabaseObjectTx;
import com.orientechnologies.orient.core.annotation.OVersion;
import com.orientechnologies.orient.core.metadata.security.OUser;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.core.type.ODocumentWrapper;
import com.orientechnologies.orient.server.OServer;
import com.orientechnologies.orient.server.OServerMain;
import javax.persistence.Id;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class Main {

    public static class GeoIp  {

          @Id
          private Object id;
          @OVersion
          private Object version;


        private String from;
        private String to;
        private Long lat;
        private Long lng;
        private String country;
        private String state;

        public void setFrom(String from) {
            this.from = from;
        }

        public void setTo(String to) {
            this.to = to;
        }

        public void setCountry(String country) {
            this.country = country;
        }

        public void setState(String state) {
            this.state = state;
        }

        public String getFrom() {
            return from;
        }

        public String getTo() {
            return to;
        }

        public String getCountry() {
            return country;
        }

        public String getState() {
            return state;
        }

        public Long getLng() {
            return lng;
        }

        public Long getLat() {
            return lat;
        }

        public void setLng(Long lng) {
            this.lng = lng;
        }

        public void setLat(Long lat) {
            this.lat = lat;
        }
    }

    public static void main(String[] args) {
        try {

            String base = "/home/marco/Scrivania/orientdb/";

            OServer server = OServerMain.create();
            server.startup(new File(base + "/file/conf.xml"));


                ODatabaseObjectTx db = new ODatabaseObjectTx("local:" + base + "/db").create();
                db.getEntityManager().registerEntityClass(GeoIp.class);
                
            try {


                for (String s : db.getClusterNames()) {
                    System.out.println("name: " + s + " - " + db.countClusterElements(s));

                }

                db.begin();


                BigFile geoip_list = new BigFile(base + "/file/data/GeoIPCountryWhois.csv");


                long time = System.currentTimeMillis();


                long c = 0;


                for (String geoip_row : geoip_list) {
                    geoip_row = geoip_row.replaceAll("\"", "");
                    String[] s = geoip_row.split("\\,");
                    GeoIp geoIp = new GeoIp();
                    geoIp.setFrom(s[0]);
                    geoIp.setTo(s[1]);
                    geoIp.setLat(new Long(s[2]));
                    geoIp.setLng(new Long(s[3]));
                    geoIp.setCountry(s[4]);
                    geoIp.setState(s[5]);
                    db.save(geoIp);
                    if(c>10000 && c % 10000 == 0)
                        System.out.println(c);
                    c++;
                }



                db.commit();
                System.out.println("tot time: " + (System.currentTimeMillis() - time));
                System.out.println("commit:" + c);


            } catch (Exception e) {
                System.out.println("e:" + e.getMessage() + e.getStackTrace().toString());
                db.rollback();
            } finally {


                for (String s : db.getClusterNames()) {
                    System.out.println("name: " + s + " - " + db.countClusterElements(s));

                }

                db.close();
            }


            server.shutdown();
        } catch (Exception ex) {
            System.out.println("ex:" + ex.getMessage()+ ex.getStackTrace().toString());
        }


    }
}




qui vengono indicate le velocità (colonna speed) in base al metodologia di salvataggio usato.


altre puntate: #1

mercoledì 27 aprile 2011

java.lang.OutOfMemoryError: Java heap space


Sempre con il mio programma ciccioso arriva l'errore:

 "Exception in thread "main" java.lang.OutOfMemoryError: Java heap space" 

quindi cambio le impostazione del heap space

java -Xms<initial heap size> -Xmx<maximum heap size>

tipo:
java -Xms512m -Xmx512m

default:
java -Xms32m -Xmx128m



java.lang.OutOfMemoryError: GC overhead limit exceeded

facendo girare una app in java molto pesante mi appare il seguente errore causa da un sovradosaggio del garbage collection:


java.lang.OutOfMemoryError: GC overhead limit exceeded




per evitare basta aggiungere l'opzione -XX:-UseGCOverheadLimit alla riga di esecuzione del nostro .jar in modo da inibire il controllo del overhead del GC.

La spiegazione qui





lunedì 4 aprile 2011

MBFastUrl - nuova beta - tentativo con hostip.info

Uscita una nuova beta disponibile a questo indirizzo, ho tentato di integrare Hostip.info per analizzare la provenienza dell'ip, la procedura prevede lo scaricamento dei file del dbe l'inserimento in un file di sqllite.. anche se alla conclcusione del tutto abbiamo un db di 1.8 gb... devo ancora capire se realmente questa cosa è utile o meno..

giovedì 10 marzo 2011

Prestashop 1.4 - Cache

Quando la cache non ti fa modificare i moduli bisogna eliminare i file contenuti in

tools/smarty/cache e tools/smarty/compile

martedì 16 novembre 2010

Apache proxy dei file statici

per eseguire un proxy le risorse statiche servendole direttamente da apache.

ProxyPass /static/ !
ricordare di aggiungere il DocumentRoot altrimenti non sa dove prenderli

es:

<VirtualHost *>
     DocumentRoot /usr/local/customers/<nomesito>/

    ServerName www.<nomesito>.it

    ServerAlias noemsi.it

        RewriteEngine On
        RewriteCond %{HTTP_HOST} !www.<nomesito>.it
        RewriteRule ^(.*)$ http://www.<nomesito>.it$1 [R=301,L]

        <Proxy *>
        Order deny,allow
        Allow from all
        </Proxy>

        ProxyPreserveHost On
        ProxyPass /static !
        ProxyPass / http://www.<nomesitointerno>:8080/
        ProxyPassReverse / http://www.<nomesitointerno>.it:8080/


        ErrorLog /usr/local/customers/logs/emeroteca_error_logs
        CustomLog /usr/local/customers/logs/emeroteca_access_logs combined


</VirtualHost>

giovedì 4 novembre 2010

postgres : performace query

su una tabella con circa 94000 righe


EXPLAIN analyze select max(tnode_id) from tnes2.tnode;
Total runtime: 0.071 ms


EXPLAIN analyze select tnode_id from tnes2.tnode order by tnode_id desc limit 1;
Total runtime: 0.053 ms

martedì 26 ottobre 2010

Apache performance - ab

utility per eseguire i check su apache

ab -c 100 -n 1000 http://www.nomedelsito.it/

postgres : performace

per la versione 8.4

modificiare /etc/postgres/xx/main/postgresql.conf


shared_buffers = 768MB  #questo parametro deve essere settato con attenzione
max_prepared_transactions = 768
work_mem = 12MB

fsync = on
wal_buffers = 512kB

enable_seqscan = off 

geqo_threshold = 3

per modificare gli shared buffers sotto linux:

seguire queste indicazioni


joe /etc/sysctl.conf

kernel.shmmax = 671088640
kernel.shmall = 671088640

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216


poi reboot