Benchmark day 3: Kingston HyperX SSD 240GB (SHSS37A240G)

A principios del año pasado cedí en la tentación y terminé adquiriendo uno de los tan promocionados discos de estado sólido para el escritorio, aprovechando una oferta interesante de uno de los proveedores locales. Decirle “disco” a un dispositivo como éste es un anacronismo: no tiene nada de redondo, pero me permitiré mantener el término por cuestión de costumbre.

Para dar una definición en una línea, un Solid-State Drive o SSD es análogo a un “disco rígido” que almacena los datos persistentemente en memoria Flash, en vez de hacerlo sobre un dispositivo de rotación. La principal ventaja es una gran velocidad de acceso, además del hecho de no ser un dispositivo de base mecánica. No es la única diferencia contra un HDD, pero sí la más notable. Los SSD no son tecnología demasiado nueva, pero alrededor de 2008 / 2009 hubo un boom y desde allí comenzaron a verse más seguido en las casas de venta de hardware.

Entre las opciones del mercado, me quedé con un modelo Kingston Hyperx Savage SSD 240GB SATA 3 que hasta la fecha (año y medio de uso) se ha portado excelentemente bien (aquí las reviews). Y ahora que los tiempos no apremian tanto, puedo aprovechar para publicar el benchmark que hice en su momento, continuando con la serie de benchmarks de discos que venía realizando años atrás (ver parte I y parte II).

Antes de realizar los diagnósticos, debo mencionar que si van a hacer un análisis de atributos SMART en discos SSD de Kingston, conviene actualizar la base de unidades (drivedb.h) del paquete smartmontools mediante el comando update-smart-drivedb, pues Kingston ha variado la semántica de los atributos SMART para ciertas unidades SSD (como se detallan en este documento). Versiones antiguas de smartmontools utilizan los nombres genéricos para ciertos atributos y esto puede dar lugar a confusiones, tales como creer que una SSD está por fallar cuando no es así.

Siguen las especificaciones y más abajo los resultados por si a alguno le interesa. He remarcado los datos más relevantes.

Kingston HyperX Savage SSD 240GB
Modelo: KINGSTON SHSS37A240G
Capacidad: 240 GB
Interfaz: SATA III
Caché: 8 MB
Tipo: Disco de estado sólido
Tamaño de sector: 512 físico, 512 lógico

# hdparm -I /dev/sdb

ATA device, with non-removable media
        Model Number:       KINGSTON SHSS37A240G
        Serial Number:      [REDACTED]
        Firmware Revision:  SAFM00.r
        Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0
Standards:
        Supported: 9 8 7 6 5
        Likely used: 9
Configuration:
        Logical         max     current
        cylinders       16383   16383
        heads           16      16
        sectors/track   63      63

        CHS current addressable sectors:   16514064
        LBA    user addressable sectors:  268435455
        LBA48  user addressable sectors:  468862128
        Logical  Sector size:                   512 bytes
        Physical Sector size:                   512 bytes
        Logical Sector-0 offset:                  0 bytes
        device size with M = 1024*1024:      228936 MBytes
        device size with M = 1000*1000:      240057 MBytes (240 GB)
        cache/buffer size  = 10104 KBytes
        Form Factor: 2.5 inch
        Nominal Media Rotation Rate: Solid State Device
Capabilities:
        LBA, IORDY(can be disabled)
        Queue depth: 32
        Standby timer values: spec'd by Standard, no device specific minimum
        R/W multiple sector transfer: Max = 16  Current = 16
        Advanced power management level: 254
        DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6
             Cycle time: min=120ns recommended=120ns
        PIO: pio0 pio1 pio2 pio3 pio4
             Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
        Enabled Supported:
           *    SMART feature set
                Security Mode feature set
           *    Power Management feature set
           *    Write cache
           *    Look-ahead
           *    Host Protected Area feature set
           *    WRITE_BUFFER command
           *    READ_BUFFER command
           *    NOP cmd
           *    DOWNLOAD_MICROCODE
           *    Advanced Power Management feature set
                SET_MAX security extension
           *    48-bit Address feature set
           *    Device Configuration Overlay feature set
           *    Mandatory FLUSH_CACHE
           *    FLUSH_CACHE_EXT
           *    SMART error logging
           *    SMART self-test
           *    General Purpose Logging feature set
           *    WRITE_{DMA|MULTIPLE}_FUA_EXT
           *    Disable Data Transfer After Error Detection
           *    {READ,WRITE}_DMA_EXT_GPL commands
           *    Segmented DOWNLOAD_MICROCODE
           *    Gen1 signaling speed (1.5Gb/s)
           *    Gen2 signaling speed (3.0Gb/s)
           *    Gen3 signaling speed (6.0Gb/s)
           *    Native Command Queueing (NCQ)
           *    Host-initiated interface power management
           *    Phy event counters
           *    unknown 76[13]
           *    unknown 76[14]
           *    unknown 76[15]
           *    DMA Setup Auto-Activate optimization
                Device-initiated interface power management
           *    Software settings preservation
           *    DOWNLOAD MICROCODE DMA command
           *    SET MAX SETPASSWORD/UNLOCK DMA commands
           *    WRITE BUFFER DMA command
           *    READ BUFFER DMA command
           *    DEVICE CONFIGURATION SET/IDENTIFY DMA commands
           *    Data Set Management TRIM supported (limit 8 blocks)
           *    Deterministic read ZEROs after TRIM
Security: 
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
                frozen
        not     expired: security count
                supported: enhanced erase
        2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT. 
Checksum: correct

 

# smartctl -x /dev/sdb

smartctl 6.4 2014-10-07 r4002 [x86_64-linux-4.6.0-0.bpo.1-amd64] (local build)
Copyright (C) 2002-14, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Phison Driven SSDs
Device Model:     KINGSTON SHSS37A240G
Serial Number:    [REDACTED]
Firmware Version: SAFM00.r
User Capacity:    240.057.409.536 bytes [240 GB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    Solid State Device
Form Factor:      2.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-2 (minor revision not indicated)
SATA Version is:  SATA 3.1, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Wed Jul  6 22:13:10 2016 ART
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
See vendor-specific Attribute list for marginal Attributes.

General SMART Values:
Offline data collection status:  (0x00)	Offline data collection activity
					was never started.
					Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0)	The previous self-test routine completed
					without error or no self-test has ever 
					been run.
Total time to complete Offline 
data collection: 		(   30) seconds.
Offline data collection
capabilities: 			 (0x5b) SMART execute Offline immediate.
					Auto Offline data collection on/off support.
					Suspend Offline collection upon new
					command.
					Offline surface scan supported.
					Self-test supported.
					No Conveyance Self-test supported.
					Selective Self-test supported.
SMART capabilities:            (0x0003)	Saves SMART data before entering
					power-saving mode.
					Supports SMART auto save timer.
Error logging capability:        (0x01)	Error logging supported.
					General Purpose Logging supported.
Short self-test routine 
recommended polling time: 	 (   1) minutes.
Extended self-test routine
recommended polling time: 	 (   2) minutes.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   100   100   050    Pre-fail  Always       -       0
  2 Not_In_Use              0x0005   100   100   050    Pre-fail  Offline      -       0
  3 Not_In_Use              0x0007   100   100   050    Pre-fail  Always       -       0
  5 Retired_Block_Count     0x0013   100   100   050    Pre-fail  Always       -       0
  7 Not_In_Use              0x000b   100   100   050    Pre-fail  Always       -       0
  8 Not_In_Use              0x0005   100   100   050    Pre-fail  Offline      -       0
  9 Power_On_Hours          0x0012   100   100   000    Old_age   Always       -       2488
 12 Power_Cycle_Count       0x0012   100   100   000    Old_age   Always       -       30
168 SATA_Phy_Error_Count    0x0012   100   100   000    Old_age   Always       -       0
170 Bad_Blk_Ct_Erl/Lat      0x0003   100   100   010    Pre-fail  Always       -       0/556
173 MaxAvgErase_Ct          0x0012   100   100   000    Old_age   Always       -       40 (Average 3)
175 Not_In_Use              0x0013   100   100   050    Pre-fail  Always       -       0
183 Unknown_Attribute       0x0012   100   100   100    Old_age   Always   FAILING_NOW 2621443
187 Reported_Uncorrect      0x0012   100   100   000    Old_age   Always       -       0
192 Unsafe_Shutdown_Count   0x0012   100   100   000    Old_age   Always       -       19
194 Temperature_Celsius     0x0023   076   060   030    Pre-fail  Always       -       24 (Min/Max 19/40)
196 Not_In_Use              0x0002   100   100   010    Old_age   Always       -       0
197 Not_In_Use              0x0032   100   100   000    Old_age   Always       -       0
199 CRC_Error_Count         0x000b   100   100   050    Pre-fail  Always       -       0
218 CRC_Error_Count         0x000b   100   100   050    Pre-fail  Always       -       0
231 SSD_Life_Left           0x0013   100   100   000    Pre-fail  Always       -       100
233 Flash_Writes_GiB        0x000b   100   100   000    Pre-fail  Always       -       570
240 Not_In_Use              0x0013   100   100   000    Pre-fail  Always       -       0
241 Lifetime_Writes_GiB     0x0012   100   100   000    Old_age   Always       -       538
242 Lifetime_Reads_GiB      0x0012   100   100   000    Old_age   Always       -       186
244 Average_Erase_Count     0x0002   100   100   000    Old_age   Always       -       3
245 Max_Erase_Count         0x0002   100   100   000    Old_age   Always       -       40
246 Total_Erase_Count       0x0012   100   100   000    Old_age   Always       -       239616

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%      2481         -
# 2  Extended offline    Completed without error       00%       529         -

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

El atributo 183, indicado como FAILING NOW no ha de ser estimado pues según el documento de Kingston no corresponde a un atributo relevante.

# hdparm -tT /dev/sdb

/dev/sdb:
 Timing cached reads:   25580 MB in  2.00 seconds = 12801.73 MB/sec
 Timing buffered disk reads: 1580 MB in  3.00 seconds = 526.61 MB/sec

$ dd if=/dev/zero of=archivo.img count=1K bs=1M conv=fdatasync

1024+0 registros leídos
1024+0 registros escritos
1073741824 bytes (1,1 GB) copiados, 2,35045 s, 457 MB/s

Las pruebas de lectura con hdparm y con dd. Cuanto más velocidad indiquen, mejor, por supuesto.

palimpsest – Prueba de rendimiento de solo lectura (clic para agrandar)

Este gráfico representa la velocidad de lectura y el tiempo de acceso en distintas partes del disco. La línea azul representa la velocidad de lectura (asociada a la escala izquierda), mientras que los puntos verdes representan los tiempos de acceso en distintas ubicaciones del disco (asociada a la escala derecha).

Como puede verse, al ser un disco SSD (no rotativo), la velocidad de lectura es casi constante en todo el espacio, y se aprecia la diferencia notable entre los discos tradicionales. Los tiempos de acceso de la SSD rondan entre 0.1 y 0.2 ms (SSD) contra 20.1 ms (HDD), velocidad media de lectura de 554 MB/s contra 118 MB/s de un disco rígido tradicional.

Aquí dejo una comparativa de velocidad entre un disco rotativo y la SSD (clic para agrandar). Presten especial atención a las unidades.

Gráficos originales: parte I, parte II y parte III.

$ bonnie++

Version  1.97       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
hc-maurom    15864M  1514  99 521685  34 259973  24 +++++ +++ 645581  28 +++++ +++
Latency             10308us     246ms     296ms    2681us    3144us    2510us
Version  1.97       ------Sequential Create------ --------Random Create--------
hc-maurom           -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++
Latency                50us     407us    1048us     667us       5us     442us

Los resultados de bonnie++ son bastante completos. Además de hacer mediciones de entrada/salida sobre el disco, mide también operaciones sobre el sistema de archivos (que por ahora no reviso). Lo relevante son las tasas de escritura y lectura en bloques, la cantidad de búsquedas por segundo (más es mejor) y la latencia de las mismas (menos es mejor). Al comparar contra otras mediciones, recuerden que las unidades en este último reporte son ms (milisegundos) y µs (microsegundos)!

Todas las pruebas fueron realizadas sobre una partición ext4.

Benchmark day 2: WD Caviar Red 1TB (WDC WD10EFRX-68JCSN0)

Esta es la segunda de la serie de pruebas a discos rígidos, esta vez contra el disco del equipo personal. Siguen las especificaciones y más abajo los resultados por si a alguno le interesa. He remarcado los datos más relevantes.

Western Digital Caviar Red 1TB
Modelo: WDC WD10EFRX-68JCSN0
Capacidad: 1 TB
Interfaz: SATA III
Caché: 64 MB
Velocidad: variable según la serie
Tamaño de sector: 4K físico, 512 lógico

 
# hdparm -I /dev/sda

ATA device, with non-removable media
	Model Number:       WDC WD10EFRX-68JCSN0                    
	Serial Number:      [REDACTED]
	Firmware Revision:  01.01A01
	Transport:          Serial, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0
Standards:
	Supported: 8 7 6 5 
	Likely used: 8
Configuration:
	Logical		max	current
	cylinders	16383	16383
	heads		16	16
	sectors/track	63	63
	--
	CHS current addressable sectors:   16514064
	LBA    user addressable sectors:  268435455
	LBA48  user addressable sectors: 1953525168
	Logical  Sector size:                   512 bytes
	Physical Sector size:                  4096 bytes
	Logical Sector-0 offset:                  0 bytes
	device size with M = 1024*1024:      953869 MBytes
	device size with M = 1000*1000:     1000204 MBytes (1000 GB)
	cache/buffer size  = unknown
Capabilities:
	LBA, IORDY(can be disabled)
	Queue depth: 32
	Standby timer values: spec'd by Standard, with device specific minimum
	R/W multiple sector transfer: Max = 16	Current = 16
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
	     Cycle time: min=120ns recommended=120ns
	PIO: pio0 pio1 pio2 pio3 pio4 
	     Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
	Enabled	Supported:
	   *	SMART feature set
	    	Security Mode feature set
	   *	Power Management feature set
	   *	Write cache
	   *	Look-ahead
	   *	Host Protected Area feature set
	   *	WRITE_BUFFER command
	   *	READ_BUFFER command
	   *	NOP cmd
	   *	DOWNLOAD_MICROCODE
	    	Power-Up In Standby feature set
	   *	SET_FEATURES required to spinup after power up
	    	SET_MAX security extension
	   *	48-bit Address feature set
	   *	Device Configuration Overlay feature set
	   *	Mandatory FLUSH_CACHE
	   *	FLUSH_CACHE_EXT
	   *	SMART error logging
	   *	SMART self-test
	    	Media Card Pass-Through
	   *	General Purpose Logging feature set
	   *	64-bit World wide name
	   *	URG for READ_STREAM[_DMA]_EXT
	   *	URG for WRITE_STREAM[_DMA]_EXT
	   *	IDLE_IMMEDIATE with UNLOAD
	   *	WRITE_UNCORRECTABLE_EXT command
	   *	{READ,WRITE}_DMA_EXT_GPL commands
	   *	Segmented DOWNLOAD_MICROCODE
	   *	Gen1 signaling speed (1.5Gb/s)
	   *	Gen2 signaling speed (3.0Gb/s)
	   *	Gen3 signaling speed (6.0Gb/s)
	   *	Native Command Queueing (NCQ)
	   *	Host-initiated interface power management
	   *	Phy event counters
	   *	Idle-Unload when NCQ is active
	   *	NCQ priority information
	   *	unknown 76[15]
	   *	DMA Setup Auto-Activate optimization
	    	Device-initiated interface power management
	   *	Software settings preservation
	   *	SMART Command Transport (SCT) feature set
	   *	SCT LBA Segment Access (AC2)
	   *	SCT Error Recovery Control (AC3)
	   *	SCT Features Control (AC4)
	   *	SCT Data Tables (AC5)
	    	unknown 206[7]
	    	unknown 206[12] (vendor specific)
	    	unknown 206[13] (vendor specific)
Security: 
	Master password revision code = 65534
		supported
	not	enabled
	not	locked
		frozen
	not	expired: security count
		supported: enhanced erase
	140min for SECURITY ERASE UNIT. 140min for ENHANCED SECURITY ERASE UNIT. 
Logical Unit WWN Device Identifier: 50014ee209106fb8
	NAA		: 5
	IEEE OUI	: 0014ee
	Unique ID	: 209106fb8
Checksum: correct

 
# smartctl -x /dev/sda

smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.13.0] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Device Model:     WDC WD10EFRX-68JCSN0
Serial Number:    [REDACTED]
LU WWN Device Id: 5 0014ee 209106fb8
Firmware Version: 01.01A01
User Capacity:    1.000.204.886.016 bytes [1,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Tue Jan 21 20:01:34 2014 ART
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x00)	Offline data collection activity
                                        was never started.
                                        Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0)	The previous self-test routine completed
                                        without error or no self-test has ever 
                                        been run.
Total time to complete Offline data collection: (13320) seconds.
Offline data collection capabilities:
                                        (0x7b) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new command.
                                        Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003)	Saves SMART data before entering power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01)	Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine recommended polling time:        (   2) minutes.
Extended self-test routine recommended polling time:     ( 152) minutes.
Conveyance self-test routine recommended polling time:   (   5) minutes.
SCT capabilities: 	       (0x30bd)	SCT Status supported.
                                        SCT Error Recovery Control supported.
                                        SCT Feature Control supported.
                                        SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAGS    VALUE WORST THRESH FAIL RAW_VALUE
  1 Raw_Read_Error_Rate     POSR-K   200   200   051    -    0
  3 Spin_Up_Time            POS--K   138   133   021    -    4058
  4 Start_Stop_Count        -O--CK   100   100   000    -    47
  5 Reallocated_Sector_Ct   PO--CK   200   200   140    -    0
  7 Seek_Error_Rate         -OSR-K   200   200   000    -    0
  9 Power_On_Hours          -O--CK   098   098   000    -    1920
 10 Spin_Retry_Count        -O--CK   100   253   000    -    0
 11 Calibration_Retry_Count -O--CK   100   253   000    -    0
 12 Power_Cycle_Count       -O--CK   100   100   000    -    47
192 Power-Off_Retract_Count -O--CK   200   200   000    -    21
193 Load_Cycle_Count        -O--CK   200   200   000    -    25
194 Temperature_Celsius     -O---K   112   105   000    -    31
196 Reallocated_Event_Count -O--CK   200   200   000    -    0
197 Current_Pending_Sector  -O--CK   200   200   000    -    0
198 Offline_Uncorrectable   ----CK   100   253   000    -    0
199 UDMA_CRC_Error_Count    -O--CK   200   200   000    -    0
200 Multi_Zone_Error_Rate   ---R--   100   253   000    -    0
                            ||||||_ K auto-keep
                            |||||__ C event count
                            ||||___ R error rate
                            |||____ S speed/performance
                            ||_____ O updated online
                            |______ P prefailure warning

SMART Extended Comprehensive Error Log Version: 1 (6 sectors)
No Errors Logged

SMART Extended Self-test Log Version: 1 (1 sectors)
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SCT Status Version:                  3
SCT Version (vendor specific):       258 (0x0102)
SCT Support Level:                   1
Device State:                        Active (0)
Current Temperature:                    31 Celsius
Power Cycle Min/Max Temperature:     27/37 Celsius
Lifetime    Min/Max Temperature:     19/38 Celsius
Under/Over Temperature Limit Count:   0/0
SCT Temperature History Version:     2
Temperature Sampling Period:         1 minute
Temperature Logging Interval:        1 minute
Min/Max recommended Temperature:      0/60 Celsius
Min/Max Temperature Limit:           -41/85 Celsius
Temperature History Size (Index):    478 (350)

SCT Error Recovery Control:
           Read:     70 (7,0 seconds)
          Write:     70 (7,0 seconds)

SATA Phy Event Counters (GP Log 0x11)
ID      Size     Value  Description
0x0001  2            0  Command failed due to ICRC error
0x0002  2            0  R_ERR response for data FIS
0x0003  2            0  R_ERR response for device-to-host data FIS
0x0004  2            0  R_ERR response for host-to-device data FIS
0x0005  2            0  R_ERR response for non-data FIS
0x0006  2            0  R_ERR response for device-to-host non-data FIS
0x0007  2            0  R_ERR response for host-to-device non-data FIS
0x0008  2            0  Device-to-host non-data FIS retries
0x0009  2        33157  Transition from drive PhyRdy to drive PhyNRdy
0x000a  2           45  Device-to-host register FISes sent due to a COMRESET
0x000b  2            0  CRC errors within host-to-device FIS
0x000f  2            0  R_ERR response for host-to-device data FIS, CRC
0x0012  2            0  R_ERR response for host-to-device non-data FIS, CRC
0x8000  4       523088  Vendor specific

He resaltado el contador de ciclos de carga (Load Cycle Count) puesto que es un dato a tener presente ya que otras series de discos de WD, vale decir, los Caviar Green, han tenido problemas al utilizar una política de ahorro de energía demasiado agresiva que reduce el tiempo de vida de la unidad. En este disco, por suerte, el conteo de ciclos parece bastante normal.

 
# hdparm -tT /dev/sda

/dev/sda:
 Timing cached reads:   26724 MB in  2.00 seconds = 13374.46 MB/sec
 Timing buffered disk reads: 422 MB in  3.01 seconds = 140.12 MB/sec

 
$ dd if=/dev/zero of=archivo.img count=1K bs=1M conv=fdatasync

1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 9.80654 s, 109 MB/s

Las pruebas de lectura con hdparm y con dd. Cuanto más velocidad indiquen, mejor, por supuesto.

 
palimpsest – Prueba de rendimiento de solo lectura (clic para agrandar)

wd_caviar_red_1tb_palimpsest

Este gráfico representa la velocidad de lectura y el tiempo de acceso en distintas partes del disco, desde los sectores más externos al plato (parte izquierda) hasta los más cercanos al eje (parte derecha). La línea azul representa la velocidad de lectura (asociada a la escala izquierda), mientras que los puntos verdes representan los tiempos de acceso en distintas ubicaciones del disco (asociada a la escala derecha).

Es notable la diferencia en la velocidad de lectura que existe al operar con los primeros sectores respecto de los últimos: 155 MB/s contra 70 MB/s. Como curiosidad, a su vez, se puede advertir que los sectores del centro del plato tienen un tiempo de acceso ligeramente más uniforme.

 
$ bonnie++

Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
hc-maurom       16G  1229  95 114703  11 52129   4  6031  88 154671   7 102.4   2
Latency              8984us    2427ms     688ms   22552us     122ms     731ms
Version  1.96       ------Sequential Create------ --------Random Create--------
hc-maurom           -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 26100  22 +++++ +++ 25978  16 +++++ +++ +++++ +++ +++++ +++
Latency             26012us     340us     771us      42us       9us      26us

Los resultados de bonnie++ son bastante completos. Además de hacer mediciones de entrada/salida sobre el disco, mide también operaciones sobre el sistema de archivos (que por ahora no reviso). Lo relevante son las tasas de escritura y lectura en bloques, la cantidad de búsquedas por segundo (más es mejor) y la latencia de las mismas (menos es mejor).

 
Todas las pruebas fueron realizadas sobre una partición ext4.

Benchmark day 1: Seagate Barracuda 500GB (ST500DM002-1BD142)

En una charla con un viejo amigo sobre discos rígidos actuales puse de ejemplo algunos a los que he tenido acceso habitualmente. A partir de eso se me ocurrió tratar de determinar qué diferencia de rendimiento hay entre los discos de mi equipo hogareño y mi estación de trabajo, por lo que recurrí a las tradicionales herramientas de prueba en Linux.

La primera prueba va contra el disco de la estación de trabajo, siguen las especificaciones y más abajo los resultados por si a alguno le interesa. He remarcado los datos más relevantes.

Seagate Barracuda 500GB
Modelo: ST500DM002-1BD142
Capacidad: 500 GB
Interfaz: SATA III
Caché: 16 MB
Velocidad: 7200 RPM
Tamaño de sector: 4K físico, 512 lógico

 
# hdparm -I /dev/sda

ATA device, with non-removable media
	Model Number:       ST500DM002-1BD142                       
	Serial Number:      [REDACTED]
	Firmware Revision:  KC45    
	Transport:          Serial, SATA Rev 3.0
Standards:
	Used: unknown (minor revision code 0x0029) 
	Supported: 8 7 6 5 
	Likely used: 8
Configuration:
	Logical		max	current
	cylinders	16383	16383
	heads		16	16
	sectors/track	63	63
	--
	CHS current addressable sectors:   16514064
	LBA    user addressable sectors:  268435455
	LBA48  user addressable sectors:  976773168
	Logical  Sector size:                   512 bytes
	Physical Sector size:                  4096 bytes
	Logical Sector-0 offset:                  0 bytes
	device size with M = 1024*1024:      476940 MBytes
	device size with M = 1000*1000:      500107 MBytes (500 GB)
	cache/buffer size  = 16384 KBytes
	Nominal Media Rotation Rate: 7200
Capabilities:
	LBA, IORDY(can be disabled)
	Queue depth: 32
	Standby timer values: spec'd by Standard, no device specific minimum
	R/W multiple sector transfer: Max = 16	Current = 16
	Recommended acoustic management value: 208, current value: 208
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
	     Cycle time: min=120ns recommended=120ns
	PIO: pio0 pio1 pio2 pio3 pio4 
	     Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
	Enabled	Supported:
	   *	SMART feature set
	    	Security Mode feature set
	   *	Power Management feature set
	   *	Write cache
	   *	Look-ahead
	   *	Host Protected Area feature set
	   *	WRITE_BUFFER command
	   *	READ_BUFFER command
	   *	DOWNLOAD_MICROCODE
	    	SET_MAX security extension
	   *	Automatic Acoustic Management feature set
	   *	48-bit Address feature set
	   *	Device Configuration Overlay feature set
	   *	Mandatory FLUSH_CACHE
	   *	FLUSH_CACHE_EXT
	   *	SMART error logging
	   *	SMART self-test
	   *	General Purpose Logging feature set
	   *	WRITE_{DMA|MULTIPLE}_FUA_EXT
	   *	64-bit World wide name
	    	Write-Read-Verify feature set
	   *	WRITE_UNCORRECTABLE_EXT command
	   *	{READ,WRITE}_DMA_EXT_GPL commands
	   *	Segmented DOWNLOAD_MICROCODE
	   *	Gen1 signaling speed (1.5Gb/s)
	   *	Gen2 signaling speed (3.0Gb/s)
	   *	Gen3 signaling speed (6.0Gb/s)
	   *	Native Command Queueing (NCQ)
	   *	Phy event counters
	   *	unknown 76[15]
	    	Device-initiated interface power management
	   *	Software settings preservation
	   *	SMART Command Transport (SCT) feature set
	   *	SCT Long Sector Access (AC1)
	   *	SCT LBA Segment Access (AC2)
	   *	SCT Error Recovery Control (AC3)
	   *	SCT Features Control (AC4)
	   *	SCT Data Tables (AC5)
	    	unknown 206[12] (vendor specific)
	    	unknown 206[13] (vendor specific)
Security: 
	Master password revision code = 65534
		supported
	not	enabled
	not	locked
		frozen
	not	expired: security count
		supported: enhanced erase
	78min for SECURITY ERASE UNIT. 78min for ENHANCED SECURITY ERASE UNIT. 
Logical Unit WWN Device Identifier: 5000c5005022a977
	NAA		: 5
	IEEE OUI	: 000c50
	Unique ID	: 05022a977
Checksum: correct

 
# smartctl -x /dev/sda

smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.13.0] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Device Model:     ST500DM002-1BD142
Serial Number:    [REDACTED]
LU WWN Device Id: 5 000c50 05022a977
Firmware Version: KC45
User Capacity:    500,107,862,016 bytes [500 GB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  ATA-8-ACS revision 4
Local Time is:    Wed Jan 22 08:13:16 2014 ART
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x82)    Offline data collection activity
                                           was completed without error.
                                           Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0)    The previous self-test routine completed
                                           without error or no self-test has ever
                                           been run.
Total time to complete Offline data collection:         (  600) seconds.
Offline data collection capabilities:
                                    (0x7b) SMART execute Offline immediate.
                                           Auto Offline data collection on/off support.
                                           Suspend Offline collection upon new command.
                                           Offline surface scan supported.
                                           Self-test supported.
                                           Conveyance Self-test supported.
                                           Selective Self-test supported.
SMART capabilities:            (0x0003)    Saves SMART data before entering 
                                           power-saving mode.
                                           Supports SMART auto save timer.
Error logging capability:        (0x01)    Error logging supported.
                                           General Purpose Logging supported.
Short self-test routine recommended polling time:           (   1) minutes.
Extended self-test routine recommended polling time:        (  79) minutes.
Conveyance self-test routine recommended polling time:      (   2) minutes.
SCT capabilities:            (0x303f)    SCT Status supported.
                                         SCT Error Recovery Control supported.
                                         SCT Feature Control supported.
                                         SCT Data Table supported.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAGS    VALUE WORST THRESH FAIL RAW_VALUE
  1 Raw_Read_Error_Rate     POSR--   110   099   006    -    33944
  3 Spin_Up_Time            PO----   100   100   000    -    0
  4 Start_Stop_Count        -O--CK   100   100   020    -    28
  5 Reallocated_Sector_Ct   PO--CK   100   100   036    -    0
  7 Seek_Error_Rate         POSR--   073   060   030    -    22473249
  9 Power_On_Hours          -O--CK   094   094   000    -    5328
 10 Spin_Retry_Count        PO--C-   100   100   097    -    0
 12 Power_Cycle_Count       -O--CK   100   100   020    -    28
183 Runtime_Bad_Block       -O--CK   100   100   000    -    0
184 End-to-End_Error        -O--CK   100   100   099    -    0
187 Reported_Uncorrect      -O--CK   100   100   000    -    0
188 Command_Timeout         -O--CK   100   100   000    -    0
189 High_Fly_Writes         -O-RCK   100   100   000    -    0
190 Airflow_Temperature_Cel -O---K   061   054   045    -    39 (Min/Max 26/41)
194 Temperature_Celsius     -O---K   039   046   000    -    39 (0 16 0 0)
195 Hardware_ECC_Recovered  -O-RC-   044   026   000    -    33944
197 Current_Pending_Sector  -O--C-   100   100   000    -    0
198 Offline_Uncorrectable   ----C-   100   100   000    -    0
199 UDMA_CRC_Error_Count    -OSRCK   200   200   000    -    0
240 Head_Flying_Hours       ------   100   253   000    -    147261543683280
241 Total_LBAs_Written      ------   100   253   000    -    1601632265
242 Total_LBAs_Read         ------   100   253   000    -    3080541557
                            ||||||_ K auto-keep
                            |||||__ C event count
                            ||||___ R error rate
                            |||____ S speed/performance
                            ||_____ O updated online
                            |______ P prefailure warning

SMART Extended Comprehensive Error Log Version: 1 (5 sectors)
No Errors Logged

SMART Extended Self-test Log Version: 1 (1 sectors)
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SCT Status Version:                  3
SCT Version (vendor specific):       522 (0x020a)
SCT Support Level:                   1
Device State:                        Active (0)
Current Temperature:                    39 Celsius
Power Cycle Min/Max Temperature:     26/41 Celsius
Lifetime    Min/Max Temperature:     16/46 Celsius
Under/Over Temperature Limit Count:   0/0
SCT Temperature History Version:     2
Temperature Sampling Period:         1 minute
Temperature Logging Interval:        59 minutes
Min/Max recommended Temperature:     14/55 Celsius
Min/Max Temperature Limit:           10/60 Celsius
Temperature History Size (Index):    128 (77)

SCT Error Recovery Control:
           Read: Disabled
          Write: Disabled

SATA Phy Event Counters (GP Log 0x11)
ID      Size     Value  Description
0x000a  2           19  Device-to-host register FISes sent due to a COMRESET
0x0001  2            0  Command failed due to ICRC error
0x0003  2            0  R_ERR response for device-to-host data FIS
0x0004  2            0  R_ERR response for host-to-device data FIS
0x0006  2            0  R_ERR response for device-to-host non-data FIS
0x0007  2            0  R_ERR response for host-to-device non-data FIS

 
# hdparm -tT /dev/sda

/dev/sda:
 Timing cached reads:   24824 MB in  2.00 seconds = 12423.12 MB/sec
 Timing buffered disk reads: 402 MB in  3.01 seconds = 133.65 MB/sec

 
$ dd if=/dev/zero of=archivo.img count=1K bs=1M conv=fdatasync

1024+0 registros leídos
1024+0 registros escritos
1073741824 bytes (1,1 GB) copiados, 9,96082 s, 108 MB/s

 
palimpsest – Prueba de rendimiento de solo lectura (clic para agrandar)

seagate_barracuda_500g_palimpsest

 
$ bonnie++

Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
soda         15808M  1105  96 112638   7 45472   4  4853  74 151543   6 271.5   4
Latency             10287us     436ms    1531ms   85189us     151ms    1255ms
Version  1.96       ------Sequential Create------ --------Random Create--------
soda                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 26311  22 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++
Latency             57369us     312us     316us     292us      14us      77us

 
Todas las pruebas fueron realizadas sobre una partición ext4.
Mañana van los resultados del otro disco.

Renovando el escritorio

El tiempo ha pasado sigilosamente, las máquinas virtuales tardan cada vez más en procesar, las aplicaciones requieren de más memoria y almacenamiento… En síntesis, la obsolescencia se fue adueñando de la vieja Pentium D y de su propio usuario hasta que llega el momento de una renovación.

Así se ve el escritorio nuevo:

captura_20130703

Software:
Debian GNU/Linux 7.1 (Wheezy, amd64)
Kernel 3.2.0-4-amd64 (3.2.46 en realidad)
Gnome 3.4.2 Classic (con iconos Gnome-Colors)

Hardware:
Intel Core i5-3470 @ 3.20 Ghz (quad)
Intel DZ68DB Motherboard
Intel Ivybridge Desktop HD2500 GPU
Memox 8 GB DDR3 RAM
Seagate Barracuda ST500DM002 (500 GB, 6Gb/s, 16Mb, 7200RPM)

Waiting for /dev to be fully populated…

Desde hace algunos meses me venía mordiendo un bug extraño en la máquina de trabajo donde a partir del kernel linux 2.6.39 e incluyendo la versión 3.0.0 el sistema se bloqueaba al inicio (el clásico freeze on boot) justo después del mensaje

Waiting for /dev to be fully populated

Y luego de eso, nada. Curioso, ya que con 2.6.38 el arranque iba de lo más normal, además que el equipo es un clon de los más comunes:

Procesador: Intel(R) Pentium(R) D CPU 2.80GHz
Motherboard: Intel Corp. D102GGC2
VGA: ATI Technologies Inc RC410 [Radeon Xpress 200]
Memoria: 1 GB

Obviamente a esa altura del arranque no hay muchos dispositivos disponibles, por lo que logs como para diagnóstico no tenía ninguno, así que por un tiempo desistí la investigación y me mantuve con el 2.6.38, ya que había que trabajar.

El primer sospechoso fue naturalmente udev, al fin y al cabo era el emisor del último mensaje que veía en pantalla. Diagnosticar problemas con udev es, digamos, un poco tedioso. Si leen el manual de udev encontrarán que en /etc/udev/udev.conf puede establecerse la variable udev_log en err, info o debug para definir la prioridad de los mensajes que serán mostrados en pantalla. Una vez hecho el cambio basta con reiniciar el equipo para ver los mensajes de información o diagnóstico correspondientes.Pero recientemente, aprovechando un día que llegué demasiado temprano, le dediqué unos minutos a este inconveniente que ya me tenía incómodo.

Desde ya es todo un pergamino de eventos el que va sucediendo en el arranque. Tantos eventos (y sin logging ni forma de recuperar los que ya pasaron) que me resultó imposible encontrar un patrón extraño o una pista siquiera de qué es lo que estaba sucediendo. Opté entonces por el clásico diagnóstico del pobre: conociendo dónde almacena udev las reglas (/lib/udev/rules.d/), fui desactivando las reglas y reiniciando el sistema tras cada cambio. Si el sistema continuaba el arranque luego del mensaje “Waiting for /dev …” entonces las reglas activadas eran inocentes; si no, alguna de las reglas activadas es la culpable. En algunos inicios no tenía gráfica, en otros no tenía disco, y en la mayoría ni siquiera teclado.

Una especie de búsqueda dicotómica me llevó, en pocos reinicios, a encontrar el archivo presuntamente culpable: 80-drivers.rules. Incluso llegué a determinar que la línea responsable era la séptima. Sin embargo el avance no fue mucho, ya que esta línea carga un montón de módulos en el kernel entre los cuales estan los de teclado y ratón: se ampliaba la lista de sospechosos.

Hasta acá, apenas si moví un paso, pero al menos llegaba a arrancar y controlar el sistema mediante SSH. Entonces un gran compañero de laburo (hat tip a Leandro), iluminado por el conocimiento (o quizá cansado de mis improperios) me recomendó: “¿y si probás cargando los módulos que faltan, uno a uno?”.

Entonces iniciamos el diagnóstico del pobre parte II. Haciendo un diff casero entre el lsmod del equipo iniciando con kernel 2.6.38 y uno iniciando con kernel 2.6.39 (sin 80-drivers.rules) llegamos a una lista de unos doce o quince módulos faltantes. Allí, tan cerca, login ssh y a probar cada uno de los módulos… pcspkr, evdev, psmouse, snd_hda_intel, todos cargaban bien… parport, fuse, ok… processorchan! ahí se tildó todo.

AHA! El módulo processor! Pero ¿qué función cumple ese módulo? O mejor, ¿por qué sigue andando el sistema sin él?. Bueno, resulta que es el ACPI Processor Driver, que no es realmente necesario pero maneja cuestiones útiles tales como los estados de energía del procesador. Si lo recuerdan ACPI ya nos viene dando dolores de cabeza desde hace bastante.

Ya con esos datos, una búsqueda en Google reveló un dato fundamental, aunque se ve que no es nuevo: en ciertos equipos el sistema se cuelga a menos que uno cargue el módulo processor con el parámetro nocst=1.

Así que, de momento, agregué la línea

processor.nocst=1

a los parámetros de inicio del sistema y con eso estoy andando actualmente. ¿A qué se debe el bug? Ni idea, habría que hacer un bisect entre las versiones de kernel 2.6.38 y 2.6.39 para determinar cual es el commit jodido. En cualquier caso, queda como tarea para vacaciones…

Reiniciando [rebooting]

Matthew Garrett es un biólogo (ahá) y reconocido hacker de Linux que lidia normalmente con complejas cuestiones de bajo nivel, pegadas al hardware, tales como ACPI, EFI, power management, y otras, que normalmente publica sus desventuras en el campo digital en un blog en livejournal. Muchos de sus artículos me han resultado realmente sorprendentes en cuanto a los intrincados detalles que pueblan los componentes de hardware desarrollados por diversos fabricantes.

Esta última semana publicó un artículo sobre el sencillo problema de cómo reiniciar correctamente una computadora. Me he tomado la libertad de traducir mejor dicho, interpretar ilegalmente, el post en cuestión. Para aquellos que se sientan cómodos con el inglés, les recomiendo el artículo original.


Reiniciando

Se podría pensar que es fácil reiniciar una PC, ¿no? Pero también podría pensarse que es fácil convencer a la gente de que al menos hacer un esfuerzo para ser amable con los demás es una propuesta de beneficio mutuo, y miren lo bien que nos ha funcionado.

Linux tiene un montón de maneras diferentes de reiniciar un sistema x86. Algunas de ellas son exclusivas para 32 bits y por eso las voy a ignorar porque, honestamente, que estás haciendo de tu vida [si estás trabajando en 32 bits]. Además, son horribles. Entonces, esto nos deja con cinco de ellas:

  • kbd – reiniciar a través del controlador de teclado. La IBM PC original tenía la línea [el cable] de reinicio de la CPU asociada a la controladora del teclado. Escribiendo la apropiada cantidad mágica de pulsos en la línea y la máquina se reinicia. Todo esto es muy sencillo, salvo por el hecho de que las máquinas modernas no tienen controladores de teclado (en realidad son parte del controlador embebido) e incluso las máquinas más modernas ni siquiera pretenden tener un controlador de teclado. Ahora, los controladores embebidos ejecutan software. Y, como todos sabemos, el software es terrible. Pero, aún peor, el software del controlador embebido está escrito por autores de BIOS. Así que claramente cualquier pretensión de que esto funcione es una especie de ficción complicada. Algunas máquinas son muy exigentes con el hardware, exigiendo que esté en el estado exacto que Windows lo programaría. Algunas máquinas funcionan 9 de cada 10 veces y luego se bloquean debido a algún raro problema de temporización. Y otras simplemente no funcionan en absoluto. ¡Hurra!
  • triple – intentar generar una falla triple. Esto se realiza cargando una tabla vacía como vector de interrupciones, y luego llamando a int(3). Falla la interrupción (no hay IDT), falla el manejador de fallos (no hay IDT) y la CPU entra en un estado que debería, en teoría, desencadenar un reinicio. Salvo que no parece haber un requerimiento de que esto suceda, y esto simplemente no funciona en un montón de máquinas.
  • pci – en realidad no pci. Tradicionalmente, el acceso al espacio de configuración PCI se logra escribiendo un valor de 32 bits al puerto io 0xcf8 para identificar el bus, el dispositivo, la función y el registro de configuración. El puerto 0xcfc luego contiene el [valor del] registro en cuestión. Pero si se escribe el par apropiado de valores mágicos en 0xcf9, la máquina se reiniciará. Espectacular! Y no estandarizado de ninguna manera (ciertamente no es parte de la especificación PCI), por lo que chipsets diferentes pueden tener diferentes requisitos. Booo.
  • efi – Los servicios EFI en tiempo de ejecución proporcionan un punto de entrada para reiniciar la máquina. Incluso a veces funciona! Siempre y cuando los servicios de tiempo de ejecución EFI estén funcionando, lo que puede ser una exageración.
  • acpi – Las versiones recientes de la especificación ACPI permiten especificar una dirección (por lo general en espacio de memoria o E/S de sistema) y un valor a escribir ahí. La idea es que escribir el valor a la dirección reinicia el sistema. Resulta que eso, a menudo, falla. También es imposible representar el método de reinicio PCI a través de ACPI, porque el método de reinicio PCI requiere un par de valores y ACPI sólo da uno.

Ahora, debo admitir que esto suena bastante deprimente. Pero la gente claramente vende computadoras con la expectativa de que van a reiniciarse correctamente, entonces ¿qué es lo que pasa?

Hace un tiempo hice algunas pruebas con Windows corriendo sobre qemu. Esta es una buena manera de evaluar el comportamiento del sistema operativo, porque uno tiene el control completo de lo que se entrega al sistema operativo y lo que el sistema operativo trata de hacer con el hardware. Y lo que descubrí fue un poco sorprendente. En ausencia de un vector de reinicio ACPI, Windows utiliza el controlador del teclado, espera un momento, lo intenta de nuevo y luego abandona. Si existe un vector de reinicio ACPI, Windows lo utiliza, luego prueba con el controlador del teclado, luego vuelve a utilizar el vector ACPI y prueba el controlador del teclado una vez más.

Esto resulta ser importante. Lo primero que significa es que genera dos escrituras en el vector ACPI de reinicio el sistema. El segundo es que deja un espacio entre ellas mientras toquetea el controlador de teclado. Y, sorprendentemente, resulta que en la mayoría de los sistemas el vector de reinicio ACPI apunta a 0xcf9 en el espacio de E/S del sistema. Incluso cuando la mayoría de las implementaciones nominalmente requieren escribir dos valores distintos, parece que este no es un requisito estricto y el método ACPI funciona.

[La versión del kernel Linux] 3.0 incluirá este comportamiento por defecto. Hace que varias máquinas funcionen (algunas Apple, por ejemplo), mejora las cosas en otras (algunas Thinkpad parecen quedarse tiesas durante largos períodos de tiempo, de otra manera) y con un poco de suerte evitará la necesidad de añadir más peculiaridades específicos al código de reinicio. Todavía hay algunas divergencias entre nosotros y Windows (mayormente en cuán seguido escribimos en el controlador de teclado), que se puede limpiar si resulta que hace alguna diferencia en cualquier lugar.

Ahora. De vuelta a los bugs de EFI.

– mjg59

Diez sistemas operativos en una netbook

Mi buen amigo Efraim es de esos informáticos que la tienen muy pero muy clara. Es de los administradores que hacen su trabajo con seriedad, pero de forma casi imperceptible para que las redes de las organizaciones sigan funcionando a pesar de las barbaridades que se ven en los desarrollos que corren sobre ellas (y de esas anécdotas hay para hacer un libro). Tiene, eso sí, la costumbre de exprimir al máximo todo hardware que pasa por sus manos; de hecho más de una vez lo he encontrado dejado procesando equipos una semana entera para entrenar redes neuronales.

Entre esos arranques -que a mi no se me ocurren ni por casualidad- se preguntó que tal andaría una netbook con diez sistemas operativos corriendo a la vez. Nueve Ubuntu(s), para ser preciso, virtualizados con KVM + KSM sobre un Debian que actúa de host, y todos al mismo tiempo y todos en una netbook. Contrario a lo que uno hubiera esperado, la verdad se la bancó muy bien, manteniendo responsivo el escritorio, como pueden ver por la captura de pantalla (de paso, con compiz). Allí está ingresando en uno de los virtualizados, mientras los restantes aún muestran la pantalla de inicio de sesión.

Por supuesto que no es cualquier netbook; de todas las que hay en el mercado, esta belleza de Asus [ver reviews 1 y 2] tiene un procesador de 64 bits y virtualización por hardware, lo que hace posible semejante comportamiento.

Tres soluciones al hilo

Desde hace varios días vengo anotando algunas dificultades que he tenido con linux y el hardware y que soluciones aporta la gente en foros, blogs y otros espacios (que afortunadamente google indexa). Como es de costumbre, para quedar tranquilo prefiero, antes de olvidarlas, dejarlas registradas acá.

1. En Debian/Ubuntu de 64 bits (amd64) no incia Skype, o bien el nuevo plugin de Google Talk para linux se instala pero no funciona, dando el siguiente (o similar) mensaje de error:

Inconsistency detected by ld.so: dl-open.c: 611: _dl_open: Assertion 
`_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT' failed!

Esto probablemente surge debido a una incompatibilidad entre arquitecturas de las librerías de pulseaudio y puede solucionarse quitando el permiso de lectura en los archivos de 32 bits de tal librería, como se detalla en los comentarios de este post de skype. Con el plugin de google talk ocurre lo mismo, salvo que no estalla sino que “no permite usar el chat de voz y video” aunque esté instalado correctamente. Los pasos son sencillos:

# chmod a-r /usr/lib32/libpulse.so*
# chmod a-r /usr/lib32/libpulse-simple.so*

Hecho esto, es cuestión de cerrar y volver a abrir la sesión de usuario para que salgan andando ambos programas.

2. Siguiendo con temas de sonido, en equipos Dell Studio 1558 y similares con Debian/Ubuntu no funcionan las salidas de auriculares y/o el micrófono incorporado en las aplicaciones de captura de sonido (léase skype, google-talk, etc.).

En el blog stfunoob y en sathyaphoenix dan como solución especificar un parámetro adicional en la carga del módulo que controla la placa de sonido. En estas portátiles, específicamente, conviene hacer:

# echo "options snd-hda-intel model=dell-m6-dmic" > /etc/modprobe.d/alsa-dell.conf

y reiniciar el equipo o volver a cargar los módulos de sonido, lo que sea más sencillo. Con eso es posible utilizar el micrófono incorporado en la laptop en aplicaciones de voip y con la calidad que corresponde.

3. Y también en portátiles Dell Studio 1558 y similares, el cargador de arranque GRUB2 se instala correctamente, pero falla luego del reiniciar en Windows Vista/7 e impide iniciar cualquiera de los sistemas operativos instalados, dejando el equipo inutilizado con el siguiente mensaje de error:

GRUB loading.
no module name found
Aborted. Press any key to exit.

Inicialmente es posible recuperar el inicio restaurando el cargador desde un disco de Ubuntu, de rescate de Debian (el mismo disco de instalación tiene un modo “rescue”) o bien utilizando SuperGrubDisk para volver a grabar el cargador en el MBR.

Lo que ocurre aquí es una incompatibilidad entre la aplicación de copia de seguridad Dell DataSafe Backup, según está registrado en varios foros y en los bugs 441941, 482757 y 551721 de Ubuntu. Con cada reinicio de Windows, la aplicación sobreescribe cierta parte inicial del disco corrompiendo el arranque de GRUB. Hay varias alternativas de solución:

a. Generar y grabar los discos de recuperación de Dell y luego eliminar la aplicación DataSafe Backup, según lo documentado en este blog, y finalmente reinstalar GRUB2.

o bien, si no desean desinstalar el programa de backup,

b. Instalar el cargador de arranque BURG.

o bien, si no queda otra,

c. Agregar una entrada para el sistema operativo linux en el gestor de arranque de Windows Vista/7 utilizando EasyBCD.

Bien, como siempre, espero que les sea de utilidad como para mi lo han sido estas soluciones aportadas por la comunidad.

ata3: SRST failed (errno=-16)

Recientemente ingresó a la rama experimental de Debian el kernel 2.6.33, y aprovechando la novedad, uno de los cambios que recomiendan en la distribución es dejar los viejos drivers ide y comenzar a utilizar libata tanto para dispositivos Serial ATA (SATA) como Parallel ATA (PATA).

En la mayoría de los equipos en los que lo instalé, la transición a libata no me ha dado inconvenientes mayores más que los cambios de nombre en dispositivos (en discos, de /dev/hd* a /dev/sd*, y en dvd/cd de /dev/hd* a /dev/sr*), que normalmente no necesitan modificaciones por el usuario siempre que se utilicen etiquetas o uuid para identificar las particiones.

Sin embargo en el equipo de escritorio encontré que el arranque demoraba demasiado y devolvía errores tales como:

...
ata2: SATA link down (SStatus 0 SControl 300)
ata3: link is slow to respond, please be patient (ready=0)
ata3: SRST failed (errno=-16)
ata3: link is slow to respond, please be patient (ready=0)
ata3: SRST failed (errno=-16)
ata3: link is slow to respond, please be patient (ready=0)
ata3.01: link status unknown, clearing UNKNOWN to NONE
...

continuando luego con el inicio tradicional. En tales situaciones, utilizando libata, el sistema no reconocía la unidad de dvd. Utilizando los viejos drivers ide, sin embargo, el sistema iniciaba bien y la unidad era reconocida correctamente.

Algunos foristas recomiendan cambiar parámetros de kernel, como libata.dma y otros. Sin embargo, la única solución que me ha dado resultado fue establecer las unidades PATA en modo cable-select, como lo apuntan en el 2do post de este bug report de Ubuntu. Sólo eso basta para que el sistema inicie y detecte correctamente los dispositivos.

Curioso, cuanto menos.

Cliff Click’s Crash Course in Modern Hardware

Esta presentación de Cliff Click se me había pasado, pero como la publicaron de vuelta en Slashdot, no quiero dejarla pasar otra vez.

En el JVM Languages Summit 2009, Cliff cuenta en forma amena y tocando temas de procesadores multinúcleo, ILP, pipelining y cachés, por qué la arquitectura Von Neumann ha pasado a ser una sobre-simplificación de los procesadores actuales, y cuales son los puntos clave a tener en cuenta en lo que respecta al rendimiento del código que se ejecuta. SPOILER: ya no interesa contar los ciclos por instrucción, todo se reduce a caché misses.

Las slides en InfoQ van al compás del video, una buena idea.

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress