#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
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 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