Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 15/02/2008, à 16:43

pnprog

Des logs pour smartclt, laptop_mode et Load_Cycle_Count

Bonjour,
J'ai découvert hier les rumeurs sur les problèmes de durée de vie des disques durs de portables, en lisant les informations sur http://doc.ubuntu-fr.org/laptop_mode.
Comme cette documentation l'indique:

Les circonstances exactes de ce défaut de fonctionnement ne sont pour l'instant pas précisément connues. Afin de cerner le problème, il serait intéressant d'écrire des scripts de supervision des valeurs considérées et de les insérer sur un site communautaire en base de données avec la configuration matérielle et logicielle. Il est fort probable qu'on voit apparaitre des petits logiciels de supervision sous forme d'applet gnome directement accessibles sur le bureau gnome ; cela vous donnera la possibilité de voir l'évolution graphiquement et de configurer simplement le fonctionnement de l'ACPI de votre ordinateur.

Je ne sais pas si des scripts de ce genre ont été écris, mais en attendant, je vous propose le mien.


Le script
Il est en python, le voici:

smartctllog.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

#auteur: pnprog AT no-log DOT org
#fichier smartctllog.py
#version 0.1
#ce script est proposé sous licence GPL2 (General Public License)
#http://doc.ubuntu-fr.org/laptop_mode

#configuration
device="/dev/sda" #le disque à  surveiller
logfile="/home/smartctl.log"
period=300 #duree entre chaque log en secondes


from time import sleep
from commands import getoutput
def read_info(line):
	words=line.split(" ")
	delete=True
	while "" in words:
		words.remove("")
	return [words[1],words[-1]]

def read_smart(device):
	cmd="smartctl -a "+device+" | egrep 'Cycle|Power'"
	output=getoutput(cmd)
	results=output.split("\n")
	
	infos={'Load_Cycle_Count':'0','Power_Cycle_Count':'0','Power-Off_Retract_Count':'0','Power_On_Hours':'0'}
	
	for line in results:
		[info_clef,info_valeur]=read_info(line)
		infos[info_clef]=info_valeur
	return infos

from datetime import datetime
def date():
	now = datetime.now()
	now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
	return [now.strftime("%Y%m%d"),now.strftime("%H%M%S")]

	
def cat_laptop_mode():
	cmd="cat /proc/sys/vm/laptop_mode"
	output=getoutput(cmd)
	if len(output)==1:
		return output
	else:
		return "-1"


def write_log(logfile):
	laptop_mode=cat_laptop_mode()
	[day,time]=date()
	infos=read_smart(device)
	
	line=day+";"+time
	
	line+=";"+laptop_mode

	line+=";"+infos['Load_Cycle_Count']
	line+=";"+infos['Power_Cycle_Count']
	line+=";"+infos['Power-Off_Retract_Count']
	line+=";"+infos['Power_On_Hours']
	
	line+="\n"
	
	file = open(logfile, 'a')
	file.write(line)
	file.close()
	


while 1:
	
	write_log(logfile)
	sleep(period)

Installation et configuration

Il faut avoir installé le paquet smartmontools. apt://smartmontools
Placer ce script quelque part sur votre disque dur. Par exemple dans:
/home/votrenom/smartctllog.py
Editez le avec votre éditeur préférer est adaptez ces 3 lignes à  vos besoin:

#configuration
device="/dev/sda" #le disque à  surveiller
logfile="/home/smartctl.log" #l'emplacement du fichier de log
period=300 #duree entre chaque log en secondes

Pour le lancer automatiquement, une méthode simple consiste à  le lancer depuis /etc/rc.local
Pour cela, éditez le fichier /etc/rc.local

Et ajoutez cette ligne AVANT exit 0

python /home/votrenom/smartctllog.py &

N'oubliez pas le & à  la fin de la ligne.
Au prochain démarrage, les logs commenceront.

Dernière modification par pnprog (Le 18/02/2008, à 05:07)

Hors ligne

#2 Le 15/02/2008, à 17:09

pnprog

Re : Des logs pour smartclt, laptop_mode et Load_Cycle_Count

Commentaire
Mes compétences en programmation étant ce qu'elles sont, ce script est très basique et se contente de surveiller l'évolution de la valeur Load_Cycle_Count et les quelques autres valeurs dont la documentation parle.

Les fichier de log se présente comme ceci:

20080215;231954;0;250211;389;205;187246
20080215;232454;0;250222;389;205;187255
20080215;232955;0;250239;389;205;187264
20080215;233455;0;250254;389;205;187273

Les deux premières valeur correspondent à  la date et à  l'heure.
20080215;231453; signifie dont 2008/02/15 à  23:14:53
La troisième valeur correspond au contenu de /proc/sys/vm/laptop_mode pour connaà®tre l'état de laptop_mode
La quatrième valeur correspond au Load_Cycle_Count.
La cinquième valeur correspond au Power_Cycle_Count
La sixième valeur correspond au Power-Off_Retract_Count
La dernière valeur correspond au Power_On_Hours (qui chez moi ne donne rien de cohérent).

C'est un script sans prétention qui se contente de faire un log. Il serait certainement possible de faire un autre programme pour lire ces log et faire de beau graphiques mais bon, c'est au delà  de mes compétences. D'autres trucs sont à  améliorer, comme le lancement (ça serait peut-être mieux de faire un daemon) et de plus, je ne l'ai testé que sur mon ordinateur, donc il est très probable que ça ne marche pas très bien sur d'autres pc.

Donc vos commentaires/améliorations/bugs sont la bienvenue !

Hors ligne

#3 Le 16/02/2008, à 20:03

xelator

Re : Des logs pour smartclt, laptop_mode et Load_Cycle_Count

salut
très bonne idée ! mais

root@X31:/home/xelator# ./hdd.py
from: can't read /var/mail/time
from: can't read /var/mail/commands
./hdd.py: line 17: erreur de syntaxe près du jeton `(' inattendu
./hdd.py: line 17: `def read_info(line):'

snif

il doit me manquer une lib python ...

Hors ligne

#4 Le 17/02/2008, à 06:34

pnprog

Re : Des logs pour smartclt, laptop_mode et Load_Cycle_Count

C'est bizarre, les deux seules librairies utilisées sont:

from time import sleep
from commands import getoutput

qui sont pourtant des librairies standards.

Je ne l'ai pas précisé dans mon poste, mais il faut avoir installé le paquet smartmontools. apt://smartmontools


Sinon, je vois que tu lances le fichier depuis le shell. Apparemment tu es root, donc pas de problèmes.
Par contre, il faut rajouter au début du fichier la commande de l'interpréteur python pour que le shell sache avec quoi l'exécuter. Je pense que l'erreur vient de là .
C'est à  dire mettre en premières lignes du script:

#!/usr/bin/python
# -*- coding: utf-8 -*-

Dis moi si ça marche.
(j'ai édité mon post pour le rajouter)

Dernière modification par pnprog (Le 17/02/2008, à 06:37)

Hors ligne

#5 Le 17/02/2008, à 09:34

xelator

Re : Des logs pour smartclt, laptop_mode et Load_Cycle_Count

a oui c'est bon j'avais oublié la ligne de l'interpréteur roll
merci beaucoup

Hors ligne

#6 Le 23/03/2008, à 20:52

cynico45

Re : Des logs pour smartclt, laptop_mode et Load_Cycle_Count

Ca marche nickel... Merci ! J'ai juste ajouté une ligne dans ta write_log

line+=";"+infos['Power_On_Hours']
line+=";"+str(int(infos['Load_Cycle_Count'])/int(infos['Power_On_Hours']))
line+="\n"

Pour avoir le nombre moyen de rangement de la tête par heure ...

Merci ... et j'espère que ça va baisser, je suis à 80 /h

Hors ligne

#7 Le 09/05/2008, à 11:21

arnaud_d

Re : Des logs pour smartclt, laptop_mode et Load_Cycle_Count

Bonjour,

J'ai appris le problème de parcage des têtes complètement par hasard. J'ai tout de suite regardé pour moi car je trouve que depuis que je suis sous Ubuntu mon ordinateur "déglutit" tout le temps smile en fait je viens de tester : ce petit bruit est en fait le parcage des têtes.

J'ai fait tout ce qui est expliqué dans la doc et voici ce que j'obtiens quand je fais un

sudo smartctl -a `mount | grep '/ ' | cut -d' ' -f1 | sed -e 's#[0-9]##'` | egrep 'Cycle|Power'

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   100   100   062    Pre-fail  Always       -       0
  2 Throughput_Performance  0x0005   100   100   040    Pre-fail  Offline      -       0
  3 Spin_Up_Time            0x0007   253   253   033    Pre-fail  Always       -       1
  4 Start_Stop_Count        0x0012   100   100   000    Old_age   Always       -       1321
  5 Reallocated_Sector_Ct   0x0033   100   100   005    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000b   100   100   067    Pre-fail  Always       -       0
  8 Seek_Time_Performance   0x0005   100   100   040    Pre-fail  Offline      -       0
  9 Power_On_Hours          0x0012   094   094   000    Old_age   Always       -       2704
10 Spin_Retry_Count        0x0013   100   100   060    Pre-fail  Always       -       0
12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       1223
191 G-Sense_Error_Rate      0x000a   100   100   000    Old_age   Always       -       1
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       40
193 Load_Cycle_Count        0x0012   093   093   000    Old_age   Always       -       78980
194 Temperature_Celsius     0x0002   125   125   000    Old_age   Always       -       44 (Lifetime Min/Max 14/55)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       1
197 Current_Pending_Sector  0x0022   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0008   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x000a   200   253   000    Old_age   Always       -       0

J'ai tout d'abord calculé le ratio conseillé : Load_Cycle_Count / Power_On_Hours qui vaut ici 78980/2704 = 29. Ça va encore (la limite admise est 30.

Cependant, et là l'objet de mon message, je pense qu'il serait intéressant de faire une moyenne plus "temps réel" car moi par ex. j'ai utilisé mon ordinateur 9 mois sous win avant de passer sous linux.

Je viens de faire deux mesures espacées de 30 minutes (j'ai du me servir du pc activement pendant 10 minutes pendant ce temps). En 30 minutes mon HDD s'est parqué 31 fois soit 62 fois par heure. Je ne suis plus du tout dans les limites !

1) Que pensez vous de mes résultats ?
2) Pensez-vous que l'indicateur "instantané" est meilleur ?
3) Heu en fait ça se trouve le "bug" est résolu avec Hardy ?

Dès que je suis un peu plus fort en python, je propose quelques lignes supplémentaires dans le script !

Merci pour le script.

Arnaud

Hors ligne