Avant tout chose afin d'exposer mon problème je dois vous faire une rapide description du matériel utilisé et des conditions d'utilisation.
J'ai actuellement un serveur dédié hébergé chez ikoula (offre Green Fish). Le système d'exploitation est Centos 6.5,64 bits (installation en minimal).
La configuration de la machine est la suivante :
- Intel Atom 510 DC HT(2 x 2 x 1,66 Ghz)
- 4 Go RAM DDR2 800Mz
- 250 Go SATA
J'ai installé le jdk java 7.51.( Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
La base de donnée est PostgreSQL 9.3 (driver utilisé postgresql-9.3-1101.jdbc41jar).
J'ai tous de suite constaté des performances anormalement lente.
J'ai réalisé un programme test qui exécute les fonctionnalités suivantes :
- Chargement du driver postgresql (normalement inutile mais les temps est intéressant)
- Connexion à ma base de donnée
- Exécution d'un requête
- Test d'itérations
Voici les temps affichés sur ma machine de travail : (Windows 7 64bits, CPU I3-3220 3.30Gz, RAM 4Go)
Tps chargement driver= : [16 millisecondes]
Tps connexion= : [58 millisecondes]
Tps req= : [64 millisecondes]
tps total JDBC= : [140 millisecondes]
tps iter GC= : [526 millisecondes]
tps iter Opération arithmétique= : [01 secondes] [620 millisecondes]
tps iter accésseurs/mutateurs= : [623 millisecondes]
Voici les temps de notre serveur maison qui ma permis de m’entraîner avant de configurer le serveur dédié d'Ikoula (Centos 6.5 64bits, Pentium(R) Dual-Core CPU E5400 2.70GHz,RAM 4Go DDR2 800Mz)
Tps chargement driver= : [48 millisecondes]
Tps connexion= : [66 millisecondes]
Tps req= : [120 millisecondes]
tps total JDBC= : [238 millisecondes]
tps iter GC= : [8 millisecondes]
tps iter Opération arithmétique= : [3 millisecondes]
tps iter accésseurs/mutateurs= : [68 millisecondes]
Et enfin voici les temps sur le serveur dédié hébergé chez Ikoula:
Tps chargement driver= : [202 millisecondes]
Tps connexion= : [287 millisecondes]
Tps req= : [402 millisecondes]
tps total JDBC= : [915 millisecondes]
tps iter GC= : [32 millisecondes]
tps iter Opération arithmétique= : [9 millisecondes]
tps iter accésseurs/mutateurs= : [203 millisecondes]
NOTE :Le Tps total JDBC n'est pas une addition du temps de chargement + connexion + req c'est normal si le compte n'y est pas. (Les system.out.println mangent quelque millisecondes)
Les tests on bien sur été effectués en locale et PostgreSQL n'est pas en cause. (Les temps sur PGADMIN sont même excellent).
J'ai l'impression que les classes JAVA mettent plus de temps à se charger sur Centos.(Les temps de chargement du drivers Postgresql sont vraiment long)
Je ne comprends pas ce qui peut autant ralentir JDBC (la mémoire, le réseau local , DNS ?)
J'ai exécuté mon jar avec la jvm 1.6.45 avec postgresql 8.4, j'ai alloué plus de mémoire à mon programme, j'ai tué les processus inutiles, j'ai lancé la jvm en mode server et client, mais rien n'y fait.
Les RAM des deux PC étant les même je ne comprends pas d’où peut venir le problème.
Je ne sais plus quoi faire.
Si vous pensez que le problème est d'ordre matériel je peux vous affichez les caractéristiques techniques plus précises du CPU et de la mémoire du serveur dédié.
Merci d'avance pour vos réponses.
Le code que j'ai utilisé pour les test /
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 String url = "jdbc:postgresql://127.0.0.1:5499/mabase"; String username = "username"; String password = "password"; Properties props = new Properties(); props.setProperty("user", username); props.setProperty("password", password); Chrono cTotal = new Chrono(); Chrono cCnx = new Chrono(); Chrono cReq = new Chrono(); Chrono cLoadDriver = new Chrono(); cTotal.start(); //DEBUT TEST TPS CHARGEMENT DRIVER cLoadDriver.start(); Class.forName("org.postgresql.Driver"); // load the driver cLoadDriver.stop(); cLoadDriver.afficher("Tps chargement driver="); //FIN TEST TPS CHARGEMENT DRIVER //DEBUT TEST TPS CONNEXION cCnx.start(); conn = DriverManager.getConnection(url, props); cCnx.stop(); cCnx.afficher("Tps connexion="); //FIN TEST TPS CONNEXION //DEBUT TEST TPS REQUETE cReq.start(); String req = "SELECT ..."; PreparedStatement ps = conn.prepareStatement(req); ResultSet rs = ps.executeQuery(); while (rs.next()) { rs.getString("monChamp"); } ps.close(); cReq.stop(); cReq.afficher("Tps req="); //FIN TEST TPS REQUETE cTotal.stop(); cTotal.afficher("tps total JDBC="); //DEBUT TEST TPS ITERATIONS Integer integer; int max = 100000000; Chrono cIter = new Chrono(); cIter.start(); for (int i=0; i<max; i++) { integer = new Integer(i); } cIter.afficherAvecStop("\ntps iter GC="); cIter.start(); double value = 0; for (int i=0; i<max; i++) { value += (i/2L); } cIter.afficherAvecStop("\ntps iter Opération arithmétique="); cIter.start(); MonObject object = new MonObject(); for (int i=0; i<max; i++) { object.setValue( i + object.getValue() ); } cIter.afficherAvecStop("\ntps iter accésseurs/mutateurs="); //FIN TEST TPS ITERATIONS
Partager