Mardi 15 décembre, j'ai exposé un retour d'expérience sur la virtualisation Solaris dans le cadre de ma mission. Un petit résumé est disponible ici (merci à Eric pour la synthèse). Si vous voulez un peu plus d'info, contacter moi.
Mardi 15 décembre, j'ai exposé un retour d'expérience sur la virtualisation Solaris dans le cadre de ma mission. Un petit résumé est disponible ici (merci à Eric pour la synthèse). Si vous voulez un peu plus d'info, contacter moi.
Voilà qu'un beau matin, une node d'un cluster Oracle RAC décide de se tuer. Voiçi l'analyse postmortem qui a permis de détecter un problème de désynchronisation d'horloge (TOD & tick). On commence par ici ...
# cd /var/core/`hostname`
# file *.0
unix.0: ELF
64-bit MSB executable SPARCV9 Version 1, UltraSPARC1 Extensions Required, statically linked, not stripped, no debugging information available
vmcore.0: SunOS 5.10 Generic_127127-11 64-bit SPARC crash dump from 'xxxxxx'
# mdb unix.0 vmcore.0
Loading modules: [ unix krtld
genunix specfs dtrace ufs sd mpt px ssd fcp fctl md ip hook neti sctp arp usba zfs random ipc nfs sppp crypto cpc fcip logindmux ptm ]
>
>
::panicinfo
cpu
17
thread
30009bf86c0
message forced crash dump initiated at user
request
tstate
4400001600
g1
b
g2
0
g3
11ca714
g4
6e0
g5 88000000
g6 0
g7 30009bf86c0
o0 1211a68
o1 2a100a9b9e8
o2
1
o3 0
o4 fffffffffffffff5
o5 1000
o6 2a100a9b0b1
o7 1068368
pc 104980c
npc 1049810
y 0
>
30009bf86c0::thread -p
ADDR
PROC LWP CRED
0000030009bf86c0 600b7cb50b8 600bab9af30
6009a003d98
>
600b7cb50b8::ps -ft
S PID PPID PGID SID
UID FLAGS ADDR NAME
R
29139 28993 1772 1772 0 0x4a004000 00000600b7cb50b8 /crs/10.2.0/bin/oprocd.bin run -t 1000 -m 500 -f
T 0x30009bf86c0 <TS_ONPROC>
> 600b7cb50b8::walk thread |::findstack
stack pointer for thread 30009bf86c0: 2a100a9b0b1
000002a100a9b161 kadmin+0x4a4()
000002a100a9b221 uadmin+0x11c()
000002a100a9b2e1 syscall_trap+0xac()
Le démon opcrod est à l'origine du suicide de la node (commande uadmin). Pour rappel le démon oprocd surveille le cluster RAC et réalise le fencing du cluster RAC (isolement primitif d'un noeud lors d'une défaillance de celui-ci). Lors de ce fencing, oprocd effectue des vérifications de fonctionnement, puis se fige. Si le réveil de l’oprocd n’a pas lieu avant une durée configurée, celui-ci procède au redémarrage du noeud du cluster.
Après une petite recherche, il s'agit d'un problème de TOD : bug suivant 6595936. L'ajout des deux paramètres suivants dans le fichier system a permis de corriger le problème définitivement.
# cat /etc/system
...
* Bug ID 6595936
set tod_broken = 1
set dosynctodr = 0
..
Amélioration du script Dtrace sig.d, pour permettre d'afficher un plus grand nombre d'informations. Ca ressemble à cela :
#!/usr/sbin/dtrace -qs
proc:::signal-send
{
printf("%Y %s(pid:%d uid:%d) is sending signal %d to %s\
(pid:%d ppid:%d uid:%d)\n", walltimestamp,execname,\
pid,uid,args[2],args[1]->pr_fname,args[1]->pr_pid,\
args[1]->pr_ppid,args[1]->pr_uid);
}
Pas très compliqué à faire... Ce petit script Dtrace m'a permis de prouver que l'arrêt brutale d'une application ne provenait pas du système mais de l'application elle-même.
Comme savoir si l'on utilise correctement les appels "directio" ? Avec un petit script Dtrace, il est possible de visualiser facilement les appels systèmes et ansi vérifier correctement ce que fait Solaris. Ci-joint le petit script D qu'il suffit de modifier au besoin...
#!/usr/sbin/dtrace -s
#pragma D option flowindent
fbt:ufs:ufs_directio_read:entry
/pid == $1/
{
self->ts[probefunc] = timestamp;
}
fbt:ufs:ufs_directio_read:return
/pid == $1 && self->ts[probefunc] != 0/
{
self->duration[probefunc] = (timestamp - self->ts[probefunc])/1000;
}
fbt:ufs:ufs_directio_read:
/pid == $1/
{
trace(self->duration[probefunc]);
self->duration[probefunc] = 0;
}
Bien entendu, il y a plusieurs façon de faire. Merci de me l'indiquer, je suis preneur.
Une petite publication pour mettre en évidence les méthodes d'installation réseau (sous GRUB notamment) d' un système Solaris 10x86. Bonne lecture...
Petite procédure pour générer une image iso bootable pour Solaris 10x86 (en se basant sur GRUB). Cette article va permettre de mieux comprendre le processus d'installation réseau de Solaris 10x86 avec GRUB (sans PXE). On commence doucement par ici...
| Février 2012 | ||||||||||
| L | M | M | J | V | S | D | ||||
| 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 | ||||||||
|
||||||||||