Publié le 27 Décembre 2012

top est un outils bien connu qui permet d'afficher pas mal d'info sur l'utilisation des processus: conso CPU, mémoire, etc ...

Et bien on peut aussi utiliser top pour avoir des infos par thread (et pas uniquement par CPU). Pour se faire il faut utiliser l'option -H:

# top -H

 

Threads: 548 total,   1 running, 547 sleeping,   0 stopped,   0 zombie
%Cpu(s):  6.7 us,  1.9 sy,  0.0 ni, 90.3 id,  1.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem:   3973584 total,  3374556 used,   599028 free,   442848 buffers
KiB Swap:  9936892 total,        0 used,  9936892 free,  1019360 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND           
 3023 bliz      20   0  686m 103m  38m S   6.6  2.7   0:22.30 chromium-browse   
 1322 root      20   0  153m  58m  28m S   5.6  1.5   0:50.52 Xorg              
 2715 bliz      20   0 1568m 108m  42m S   2.3  2.8   0:34.28 compiz            
 2736 bliz      20   0  412m 109m  24m S   2.0  2.8   0:40.05 skype             
 3612 bliz      20   0  882m  71m  26m S   1.3  1.8   0:14.57 chromium-browse   
 3410 bliz      20   0  444m  34m  21m S   1.0  0.9   0:10.68 chromium-browse   
 3866 bliz      20   0  890m  70m  21m S   1.0  1.8   0:05.71 chromium-browse   
 3161 bliz      20   0  686m 103m  38m S   0.7  2.7   0:06.99 Chrome_IOThread   
 3868 bliz      20   0  890m  70m  21m S   0.7  1.8   0:00.37 Chrome_ChildIOT   
 4116 bliz      20   0 20900 1940 1164 R   0.7  0.0   0:01.53 top               
 3364 bliz      20   0 4035m 549m  27m S   0.3 14.2   0:29.33 java              

 

Tous ces chiffres ne sont peut être pas très clair. Voici donc comment les interpréter :

La ligne concernant la conso CPU dans l'entête se lit de la façon suivante:

%Cpu(s):  6.7 us,  1.9 sy,  0.0 ni, 90.3 id,  1.0 wa,  0.0 hi,  0.1 si,  0.0 st

 

us  pourcentage de temps CPU passé dans le User Space
sy  pourcentage de temps CPU dans le kernel
ni  pourcentage de temps CPU utilisé par les processus de basse priorité 
id  pourcentage de temps CPU inutilisé (idle) 
wa  pourcentage de temps CPU passé à attendre (wait on disk) 
hi  pourcentage de temps CPU utilisé par les interruptions hardware 
si  pourcentage de temps CPU utilisé par les interruptions software 
st  pourcentage de temps CPU volé à une machine virtuelle (steal time)

 

Ensuite le tableau principal se lit de la façon suivante:

PID l'identifiant du Thread (pas du processus)
USER l'identifiant de l'utilisateur qui a démarré le processus
PR La priorité du thread
NI La valeur "nice" du processus
VIRT La mémoire virtuelle aloué au processus
RES La mémoire résidente utilisée par le processus
SHR La mémoire partagée (shared) du processus
S L'état du thread
%CPU Le pourcentage d'utilisation d'un seul CPU par le thread
%MEM Le pourcentage de mémoire utilisé par le processus
TIME+ Le temps CPU utilisé par le thread
COMMAND La commande ayant lancée le processus

 

Il y a quelques petites choses à savoir en plus:

  • Pour les processus  java le thread ID peut être converti en hexa et corréler avec les thread IDs présents dans un thread dump.
  • L'état du thread peut prendre les valeurs suivantes:
    • R: running
    • S: sleeping
    • D: uninterruptible sleep
    • T: traced
    • Z: zombie
  • Le pourcentage CPU concerne un seul CPU. Par exemple sur une machine 4-core il y a 400% de CPU dispo. En revanche la ligne dans l'entête comprends les 4 CPUs dans les 100%.

Voir les commentaires

Rédigé par Bliz

Publié dans #Linux

Repost 0

Publié le 17 Décembre 2012

Oops j'ai commité alors que je n'aurai pas du! Pas de problème avec Git (tant que le commit n'est pas parti sur le remote) il suffit de faire :

git reset HEAD^

et le tour est joué. Quel commit, déjà ? :-b

Voir les commentaires

Rédigé par Bliz

Publié dans #Version control

Repost 0

Publié le 14 Décembre 2012

Si vous lancez vos applications java directement depuis Eclipse vous aurez sûrement remarquer que le nombre de lignes disponibles dans la console est plutôt assez restreint dès qu'il y a quelques exceptions à afficher.

Et bien bonne nouvelle : le nombre de caractères maximum affichés dans la console est paramètrable. Pour le changer il faut se rendre dans :

Window > Preferences > Run/Debug > Console 

puis changer la valeur de la propriété :

Console buffer size (characters)

Pour ma part je l'ai passé à 200 000.

Voir les commentaires

Rédigé par Bliz

Publié dans #Eclipse

Repost 0

Publié le 13 Décembre 2012

PowerPoint est un outil que je n'apprécie pas beaucoup et notamment un des points qui m'enerve le plus est le placement des différents composants.

En effet PowerPoint utilise par défaut des pas d'environ 10px (à vue de nez) et il est donc parfois assez difficile d'aligner correctement 2 entités ayant des tailles différentes.

Voici donc 2 solutions. La première est toute simple mais je la note ici pour ne pas l'oublier :

En maintenant la touche CTRL appuyé avant de déplacer un objet on obtient alors un déplacement au pixel près. Yahoo!

La 2 solution consiste à utiliser le menu d'alignement qui se trouve dans l'onglet :

Accueil / Organiser / Alignement

On peut aligner plusieurs entités dans différentes direction et même les répartir (distribuer) equitablement.

Voilà de quoi améliorer quelque peu la mise en page de mes diapositives.

Voir les commentaires

Rédigé par Bliz

Publié dans #Office

Repost 0

Publié le 12 Décembre 2012

Aujourd'hui j'ai besoin de tester un client pour un service web. Et suite au lancement du no-mock movement j'ai décidé de créer un vrai serveur web pour tester mon client.

Bien sûr mon serveur est très basique et ne contient aucune logique métier mais cela reste un vrai serveur HTTP.

La question est de savoir comment créer un vrai serveur en un minimum de ligne. Il existe pas mal de bibliothèque tierce qui permettent d'embarquer le serveur dans l'application java (genre Jetty, ...) mais vu les contraintes, ici je préfère quelque chose de plus simple et qui surtout éviter de rajouter une lib externe pour les tests.

Et bien justement il y a une implémentation d'un serveur HTTP caché au fond du JDK. Il s'agit de la classe "com.sun.net.httpserver.HttpServer".

L'utilisation est assez simple il faut :

  1. Créer une classe qui implémente HttpHandler et qui traitera les requêtes
  2. Créer une instance du HttpServer
  3. Créer un contexte sur le serveur auquel on attribue une instance du HttpHandler défini en 1.
  4. Démarrer le serveur

Voilà un exemple de code qui ne fait qu'envoyer une réponse fixe quelque soit le requête :

package com.over-blog.patatos;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class BasicServer {

   private static final String RESPONSE = "<RESPONSE_STRING>";

   static class MyHandler implements HttpHandler {

      public void handle(HttpExchange t) throws IOException {
         t.sendResponseHeaders(200, RESPONSE.length());
         OutputStream os = t.getResponseBody();
         os.write(RESPONSE.getBytes());
         os.close();
      }
   }

   public static void main(String[] args) throws IOException{
      HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
      server.createContext("/", new MyHandler());
      server.setExecutor(null); // creates a default executor
      server.start();
   }

Voir les commentaires

Rédigé par Bliz

Publié dans #Java

Repost 0

Publié le 7 Décembre 2012

Aujourd'hui je veux créer une table temporaire avec un CREATE TABLE ... SELECT ...

Le truc c'est que je ne sais pas à l'avance la structure de la table car le SELECT est construit dynamiquement.

Le soucis c'est que dans un soucis de performance j'ai besoin d'ajouter un index (ou une clé primaire) sur la colonne id (qui elle, est toujours dans ma table).

Et bien on peut inclure la création de l'index dans la requête de création de la table comme ceci

CREATE TABLE ma_table (INDEX (id)) SELECT id, champ1, champ2 FROM une_autre_table;

Voir les commentaires

Rédigé par Bliz

Publié dans #MySQL

Repost 0

Publié le 6 Décembre 2012

Aujourd'hui j'ai une table toute simple avec 2 champs : id et nom.

Je veux que l'id s'auto-incrémente (comme avec l'auto-incrémente de MySQL) mais je veux aussi pouvoir réutiliser les ids non utilisés (après une suppression par exemple).

Voilà un exemple pour mieux comprendre:

actions autoincrement de MySQL ce que je veux
ajout de 'Alice' 1 1
ajout de 'Bob' 2 2
ajout de 'Charles' 3 3
suppression de 'Bob' 3 2
ajout de 'Daniel' 4 3

Avec l'auto-increment de MySQL j'obtiendrai:

+----+---------+
| id | name    |
+----+---------+
|  1 | Alice   |
|  3 | Charles |
|  4 | Daniel  |
+----+---------+

alors que je veux :

+----+---------+
| id | name    |
+----+---------+
|  1 | Alice   |
|  2 | Daniel  |
|  3 | Charles |
+----+---------+

Et bien c'est possible avec la requête suivante:

SELECT COALESCE(MIN(t1.id),0) + 1 AS id FROM ma_table t1 LEFT JOIN ma_table t2 ON (t2.id = t1.id+1) WHERE t2.id IS NULL;

Et si on veut faire l'insert et le select en une seule requête ça donne :

INSERT INTO ma_table SELECT COALESCE(MIN(t1.id),0) + 1 AS id, 'Edouard' FROM ma_table t1 LEFT JOIN ma_table t2 ON (t2.id = t1.id+1) WHERE t2.id IS NULL;

Voir les commentaires

Rédigé par Bliz

Publié dans #MySQL

Repost 0

Publié le 3 Décembre 2012

Lorsque je démarre Eclipse j'ai l'erreur suivante:

Workspace Cannot Be Locked

Could not launch the product because the associated workspace is currently in use by another Eclipse application.

En fait, soit il y a déjà une instance d'Eclipse qui utilise ce workspace, soit le fichier de lock n'a pas été supprimé lors du dernier arrêt d'Eclipse (plantage).

Pour résoudre le problème il suffit de supprimer le fichier .lock qui se trouve dans le répertoire .metadata dans le workspace en question.

Voir les commentaires

Rédigé par Bliz

Publié dans #Eclipse

Repost 0