More HSP/HFP bluetooth headset woes (WH-XB700) [SOLVED]

Well, I think you have seen the previous posts (below) where I rambled about connection problems with bluetooth headphones/headsets on Debian.

If you’ve already read it, be aware that they don’t reflect the current situation. I’ll elaborate…

After moving back to Debian Bullseye a few months ago, I was given (a delightful gift from a lovely person, I must say) a pair of Sony WH-XB700 headphones which are now working great on that platform, BUT be aware that you may run into some problems while setting them up.

This is my current configuration:

$ inxi -F
System: Host: hp-laptop Kernel: 5.10.0-11-amd64 x86_64 bits: 64 Desktop: Cinnamon 4.8.6
Distro: Debian GNU/Linux 11 (bullseye)
...
Audio: Device-1: Intel Sunrise Point-LP HD Audio driver: snd_hda_intel
Sound Server: ALSA v: k5.10.0-11-amd64
...
Bluetooth: Device-1: Intel Bluetooth wireless interface type: USB driver: btusb
Report: ID: hci0 state: up running bt-v: 2.1 address: [REDACTED]
...

$ apt list --installed bluez blueman pulseaudio pulseaudio-module-bluetooth
blueman/stable,now 2.1.4-1+b1 amd64 [installed]
bluez/stable,now 5.55-3.1 amd64 [installed,automatic]
pulseaudio-module-bluetooth/stable,now 14.2-2 amd64 [installed,automatic]
pulseaudio/stable,now 14.2-2 amd64 [installed]

After connecting the headphones, sound is great with the a2dp_sink [High Fidelity Playback (A2DP Sink)] profile. HOWEVER, while trying to switch to headset_head_unit [Headset Head Unit (HSP/HFP)] profile to use the built-in microphone for calls and meets, pulseaudio kept hanging, crashing and restarting with the following errors (hidden on pulseaudio’s journal):

$ journalctl --user -u pulseaudio   # run this as normal user
...
Mar 05 12:28:14 hp-laptop pulseaudio[1290]: q overrun, queuing locally
Mar 05 12:28:15 hp-laptop pulseaudio[1290]: q overrun, queuing locally
Mar 05 12:28:15 hp-laptop pulseaudio[1290]: q overrun, queuing locally
...

Also, bluetooth logs showed problems while trying to set up the audio AVCTP / AVRCP protocols:

# journalctl -u bluetooth   # run this as root user
...
Mar 05 12:28:42 hp-laptop bluetoothd[840]: Starting SDP server
Mar 05 12:28:42 hp-laptop bluetoothd[840]: Bluetooth management interface 1.18 initialized
Mar 05 12:28:42 hp-laptop bluetoothd[840]: profiles/audio/avctp.c:avctp_server_socket() setsockopt(L2CAP_OPTIONS): Invalid argument (22)
Mar 05 12:28:42 hp-laptop bluetoothd[840]: avrcp-controller: Protocol not supported (93)
Mar 05 12:28:42 hp-laptop bluetoothd[840]: profiles/audio/avctp.c:avctp_server_socket() setsockopt(L2CAP_OPTIONS): Invalid argument (22)
Mar 05 12:28:42 hp-laptop bluetoothd[840]: audio-avrcp-target: Protocol not supported (93)
Mar 05 12:28:42 hp-laptop bluetoothd[840]: profiles/sap/server.c:sap_server_register() Sap driver initialization failed.
Mar 05 12:28:42 hp-laptop bluetoothd[840]: sap-server: Operation not permitted (1)
Mar 05 12:28:45 hp-laptop bluetoothd[840]: Endpoint registered: sender=:1.50 path=/MediaEndpoint/A2DPSink/sbc
Mar 05 12:28:45 hp-laptop bluetoothd[840]: Endpoint registered: sender=:1.50 path=/MediaEndpoint/A2DPSource/sbc
Mar 05 12:29:03 hp-laptop bluetoothd[840]: Endpoint unregistered: sender=:1.50 path=/MediaEndpoint/A2DPSink/sbc
Mar 05 12:29:03 hp-laptop bluetoothd[840]: Endpoint unregistered: sender=:1.50 path=/MediaEndpoint/A2DPSource/sbc
Mar 05 12:29:03 hp-laptop bluetoothd[840]: Endpoint registered: sender=:1.83 path=/MediaEndpoint/A2DPSink/sbc
Mar 05 12:29:03 hp-laptop bluetoothd[840]: Endpoint registered: sender=:1.83 path=/MediaEndpoint/A2DPSource/sbc
...

Well, after a lot of headaches and dead ends, it turned out that some process (I haven’t figured out which one, yet) was stealthily switching off the ERTM (Enhanced ReTransmission Mode) and ESCO (Enhanced SCO) protocols of my Bluetooth stack.

So if you have a similar problem, verify that your stack does not have them disabled by looking at /sys/module/bluetooth/parameters/

# grep --color . /sys/module/bluetooth/parameters/disable_e*
/sys/module/bluetooth/parameters/disable_ertm:N
/sys/module/bluetooth/parameters/disable_esco:N

If you see a Y there, you might want to try re-enabling ERTM and ESCO by issuing the following commands:

echo N > /sys/module/bluetooth/parameters/disable_ertm
echo N > /sys/module/bluetooth/parameters/disable_esco
systemctl restart bluetooth

After doing that, switching to headset_head_unit profile should work fine and the headset can be used without any problem.

I’ll try to test the same setup with the new pipewire stack in the following days, but in the meantime, kudos to Juan Pablo Lassala for describing the proper solution to this tricky problem on pulseaudio issue tracker.

 

Support for HSP/HFP headset profiles on Ubuntu and Debian

A few months ago I was given a “remote work toolset” that includes a bluetooth headset simply referred as “EC717”.

To be honest, they come in handy for me, because I was using the hands-free kit of my phone, and it is not the same in quality or comfort.

However, I found it impossible to get them to work on Ubuntu 20.04 and Debian 10, two of the platforms that I regularly use. They do work for listening to music, as A2DP profile, but they don’t work as a microphone for video calls, thus losing their main function. When trying to set the profile from a2dp_sink to headset_head_unit, I get this error:

W: [pulseaudio] module-bluez5-device.c: Refused to switch profile to headset_head_unit: Not connected

This issue is extensively documented in lots of bugs and pulseaudio tickets at bugs.freedesktop.org (93898, 9731673325) and in the new gitlab.freedesktop.org (84, 122, 742, 776, 960).

In short, there’s no complete support for the variety of HandSet Profile / Hands Free Profile / HSP&HFP profiles by which the audio and control channels are coordinated in Bluetooth. Actually there was support, but changes to the architecture of Bluez and PulseAudio made it disappear. And this affects some headsets that implement only one of these profiles.

Around 2017, James Bottomley coded support for those profiles in pulseaudio 11, 12 and 13, but unfortunately those patches were not incorporated into the stable branch of the pulseaudio library when he published them, and they were only added a few days ago, thus they are not available in current releases of modern distributions.

Fortunately, he segmented two branches of work in which he neatly documents the code changes in order to make this type of headsets work with pulseaudio 12 and pulseaudio 13, and from them I was able to modify and compile two versions of the pulseaudio-module-bluetooth package with HSP/HFP support for both Debian and Ubuntu:

By the way, and before you complain, according to the Bluetooth specification the HSP/HFP profile is single channel (mono) and in 8 khz (Volume 2, Section 6.12, of the Bluetooth Core 2.0 specification), so the audio quality is similar to that of a landline phone (well, that’s the spirit of HSP). In short, it sounds awful just like an analog phone. If you want to listen to music, use the A2DP profile, but with this profile it is not possible to use the headset as a microphone. Newer versions of the patch bring support for multiple codecs that improve audio quality, but of course these improvements are only available on newer, higher-quality hardware.

As for me, I also opted to make a passthru module using python3-bluez and pulseaudio virtual sources/sinks, in a script of about 600 lines, so as to communicate directly with the headset and pass the audio as new inputs and outputs on the pulseaudio stack, but the latency it added to the spoken voice made it unusable. Bottomley patches, on the other hand, worked great.

Finally, regarding code quality, if you’ve worked on SCSI, Secure Boot, TPMs and UEFI, then there is a very high probability that you’ve come across James code. So, James, cheers to you!

Soporte para headsets HSP/HFP en Ubuntu y Debian

Hace unos meses me obsequiaron un set de trabajo remoto que incluye unos auriculares bluetooth denominados simplemente “EC717”.

La verdad que me vienen muy bien, pues estaba utilizando el manos libres del celular, y no es lo mismo en calidad ni comodidad.

Sin embargo, encontré imposible hacerlos funcionar en Ubuntu 20.04 y en Debian 10, dos de las plataformas que utilizo habitualmente. En realidad sí funcionan para escuchar música, con el perfil A2DP, pero no funcionan como micrófono para videollamadas, con lo cual pierde bastante el sentido de ser un “set de trabajo remoto”. Al intentar establecer el perfil de a2dp_sink a headset_head_unit, obtengo este error:

W: [pulseaudio] module-bluez5-device.c: Refused to switch profile to headset_head_unit: Not connected

Este problema está documentado ampliamente en un montón de bugs y tickets de pulseaudio en bugs.freedesktop.org (93898, 9731673325) y en el nuevo gitlab.freedesktop.org (84, 122, 742, 776, 960)

Básicamente, no hay soporte completo para la variedad de HandSet Profile / Hands Free Profile / HSP&HFP profiles mediante los cuales se coordinan los canales de audio y control en Bluetooth. En realidad lo había, pero cambios en la arquitectura de Bluez y PulseAudio hicieron que desaparezcan. Y esto afecta de forma variada a algunos headset que implementan uno solo de dichos perfiles.

James Bottomley estuvo trabajando en 2017 en la incorporación de soporte para las versiones de pulseaudio 11, 12 y 13, pero lamentablemente esos parches no llegaron a incorporarse a la rama estable de la biblioteca pulseaudio cuando los publicó, y recién fueron incorporados hace pocos días, con lo cual no figuran ni de casualidad en las releases actuales de las distribuciones modernas.

Afortunadamente, él ha segmentado dos ramas de trabajo en las cuales marca prolijamente cuales son los cambios a incorporar para poder hacer andar este tipo de headsets con pulseaudio 12 y pulseaudio 13 , y a partir de ellos pude modificar y compilar dos versiones del paquete pulseaudio-module-bluetooth con soporte para HSP/HFP tanto en Debian como en Ubuntu:

Por cierto, y antes de que se quejen, el perfil HSP/HFP según la especificación Bluetooth es monocanal y en 8 khz (Volume 2, Section 6.12, de la especificación Bluetooth Core 2.0), por lo cual la calidad de audio es similar a la de un teléfono de línea (bueno, que en espíritu eso es HSP). En resumen, se escucha feo como en un teléfono analógico. Si quieren escuchar música, establezcan perfil A2DP, pero con ese perfil no es posible utilizar el headset como micrófono. Las versiones más nuevas del parche incorporan soporte para múltiples codecs que mejoran la calidad de audio, pero desde luego estas mejoras sólo están disponibles en hardware más moderno y de mejor calidad.

Por mi parte, también opté por hacer un passthru mediante python3-bluez y sources/sinks virtuales de pulseaudio, un script de unas 600 líneas, de forma tal de dialogar directamente con el headset y pasar el audio como entradas y salidas nuevas en el stack de la biblioteca de sonido, pero la latencia que incorporaba al sonido lo hacía inusable. Los parches de Bottomley, en cambio, funcionan perfecto.

Finalmente, respecto a la calidad del código, si estuvieron trabajando en cuestiones de SCSI, Secure Boot, TPMs y UEFI, hay una muy alta probabilidad de que estén utilizando y se hayan cruzado con código de James. Va mi agradecimiento por todos sus aportes.

 

Benchmark day 4: Toshiba 3.5″ DT01ACA 1TB (DT01ACA100)

Esta es la cuarta entrega de la serie de pruebas a discos rígidos y SSDs, motivada por una reciente actualización de la estación de trabajo. Siguen las especificaciones y más abajo los resultados por si a alguno le interesa.

Toshiba 3.5″ DT01ACA
Modelo: TOSHIBA DT01ACA100
Capacidad: 1 TB
Interfaz: SATA III
Caché: 31 MiB (aprox 24 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:       TOSHIBA DT01ACA100
	Serial Number:      [REDACTED]
	Firmware Revision:  MS2OA750
	Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0; Revision: ATA8-AST T13 Project D1697 Revision 0b
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:  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  = 23652 KBytes (type=DualPortCache)
	Form Factor: 3.5 inch
	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
	Advanced power management level: disabled
	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
	    	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
	   *	WRITE_{DMA|MULTIPLE}_FUA_EXT
	   *	64-bit World wide name
	   *	URG for READ_STREAM[_DMA]_EXT
	   *	URG for WRITE_STREAM[_DMA]_EXT
	   *	WRITE_UNCORRECTABLE_EXT command
	   *	{READ,WRITE}_DMA_EXT_GPL commands
	   *	Segmented DOWNLOAD_MICROCODE
	    	unknown 119[7]
	   *	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
	   *	NCQ priority information
	    	Non-Zero buffer offsets in DMA Setup FIS
	   *	DMA Setup Auto-Activate optimization
	    	Device-initiated interface power management
	    	In-order data delivery
	   *	Software settings preservation
	   *	SMART Command Transport (SCT) feature set
	   *	SCT Write Same (AC2)
	   *	SCT Error Recovery Control (AC3)
	   *	SCT Features Control (AC4)
	   *	SCT Data Tables (AC5)
Security: 
	Master password revision code = 65534
		supported
	not	enabled
	not	locked
		frozen
	not	expired: security count
	not	supported: enhanced erase
	156min for SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: [REDACTED]
	NAA		: 5
	IEEE OUI	: 000039
	Unique ID	: [REDACTED]
Checksum: correct

# smartctl -x /dev/sda

smartctl 6.6 2016-05-31 r4324 [x86_64-linux-4.17.0-0.bpo.1-amd64] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Toshiba 3.5" DT01ACA... Desktop HDD
Device Model:     TOSHIBA DT01ACA100
Serial Number:    [REDACTED]
LU WWN Device Id: [REDACTED]
Firmware Version: MS2OA750
User Capacity:    1.000.204.886.016 bytes [1,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    7200 rpm
Form Factor:      3.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS T13/1699-D revision 4
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Wed Aug  8 11:48:00 2018 -03
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
AAM feature is:   Unavailable
APM feature is:   Disabled
Rd look-ahead is: Enabled
Write cache is:   Enabled
ATA Security is:  Disabled, frozen [SEC2]
Wt Cache Reorder: Enabled

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

General SMART Values:
Offline data collection status:  (0x84)	Offline data collection activity
					was suspended by an interrupting command from host.
					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: 		( 7167) 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: 	 ( 120) minutes.
SCT capabilities: 	       (0x003d)	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     PO-R--   100   100   016    -    0
  2 Throughput_Performance  P-S---   142   142   054    -    71
  3 Spin_Up_Time            POS---   116   116   024    -    191 (Average 203)
  4 Start_Stop_Count        -O--C-   100   100   000    -    13
  5 Reallocated_Sector_Ct   PO--CK   100   100   005    -    0
  7 Seek_Error_Rate         PO-R--   100   100   067    -    0
  8 Seek_Time_Performance   P-S---   115   115   020    -    34
  9 Power_On_Hours          -O--C-   100   100   000    -    145
 10 Spin_Retry_Count        PO--C-   100   100   060    -    0
 12 Power_Cycle_Count       -O--CK   100   100   000    -    13
192 Power-Off_Retract_Count -O--CK   100   100   000    -    13
193 Load_Cycle_Count        -O--C-   100   100   000    -    13
194 Temperature_Celsius     -O----   206   206   000    -    29 (Min/Max 19/33)
196 Reallocated_Event_Count -O--CK   100   100   000    -    0
197 Current_Pending_Sector  -O---K   100   100   000    -    0
198 Offline_Uncorrectable   ---R--   100   100   000    -    0
199 UDMA_CRC_Error_Count    -O-R--   200   200   000    -    0
                            ||||||_ K auto-keep
                            |||||__ C event count
                            ||||___ R error rate
                            |||____ S speed/performance
                            ||_____ O updated online
                            |______ P prefailure warning

General Purpose Log Directory Version 1
SMART           Log Directory Version 1 [multi-sector log support]
Address    Access  R/W   Size  Description
0x00       GPL,SL  R/O      1  Log Directory
0x01           SL  R/O      1  Summary SMART error log
0x03       GPL     R/O      1  Ext. Comprehensive SMART error log
0x04       GPL     R/O      7  Device Statistics log
0x06           SL  R/O      1  SMART self-test log
0x07       GPL     R/O      1  Extended self-test log
0x08       GPL     R/O      2  Power Conditions log
0x09           SL  R/W      1  Selective self-test log
0x10       GPL     R/O      1  SATA NCQ Queued Error log
0x11       GPL     R/O      1  SATA Phy Event Counters log
0x20       GPL     R/O      1  Streaming performance log [OBS-8]
0x21       GPL     R/O      1  Write stream error log
0x22       GPL     R/O      1  Read stream error log
0x80-0x9f  GPL,SL  R/W     16  Host vendor specific log
0xe0       GPL,SL  R/W      1  SCT Command/Status
0xe1       GPL,SL  R/W      1  SCT Data Transfer

SMART Extended Comprehensive Error Log Version: 1 (1 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]

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.

SCT Status Version:                  3
SCT Version (vendor specific):       256 (0x0100)
SCT Support Level:                   1
Device State:                        SMART Off-line Data Collection executing in background (4)
Current Temperature:                    29 Celsius
Power Cycle Min/Max Temperature:     29/31 Celsius
Lifetime    Min/Max Temperature:     19/33 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:           -40/70 Celsius
Temperature History Size (Index):    128 (61)

Index    Estimated Time   Temperature Celsius
  62    2018-08-08 09:41    30  ***********
 ...    ..( 19 skipped).    ..  ***********
  82    2018-08-08 10:01    30  ***********
  83    2018-08-08 10:02     ?  -
 ...    ..(  4 skipped).    ..  -
  88    2018-08-08 10:07     ?  -
  89    2018-08-08 10:08    31  ************
 ...    ..( 11 skipped).    ..  ************
 101    2018-08-08 10:20    31  ************
 102    2018-08-08 10:21    30  ***********
 ...    ..(  6 skipped).    ..  ***********
 109    2018-08-08 10:28    30  ***********
 110    2018-08-08 10:29    29  **********
 ...    ..(  7 skipped).    ..  **********
 118    2018-08-08 10:37    29  **********
 119    2018-08-08 10:38    30  ***********
 ...    ..(  2 skipped).    ..  ***********
 122    2018-08-08 10:41    30  ***********
 123    2018-08-08 10:42    31  ************
 ...    ..( 11 skipped).    ..  ************
   7    2018-08-08 10:54    31  ************
   8    2018-08-08 10:55    30  ***********
 ...    ..(  5 skipped).    ..  ***********
  14    2018-08-08 11:01    30  ***********
  15    2018-08-08 11:02    29  **********
 ...    ..(  5 skipped).    ..  **********
  21    2018-08-08 11:08    29  **********
  22    2018-08-08 11:09    30  ***********
  23    2018-08-08 11:10    30  ***********
  24    2018-08-08 11:11    30  ***********
  25    2018-08-08 11:12    29  **********
  26    2018-08-08 11:13    29  **********
  27    2018-08-08 11:14    30  ***********
  28    2018-08-08 11:15    29  **********
 ...    ..( 11 skipped).    ..  **********
  40    2018-08-08 11:27    29  **********
  41    2018-08-08 11:28    30  ***********
 ...    ..(  2 skipped).    ..  ***********
  44    2018-08-08 11:31    30  ***********
  45    2018-08-08 11:32    29  **********
 ...    ..( 15 skipped).    ..  **********
  61    2018-08-08 11:48    29  **********

SCT Error Recovery Control:
           Read: Disabled
          Write: Disabled

Device Statistics (GP Log 0x04)
Page  Offset Size        Value Flags Description
0x01  =====  =               =  ===  == General Statistics (rev 1) ==
0x01  0x008  4              13  ---  Lifetime Power-On Resets
0x01  0x010  4             145  ---  Power-on Hours
0x01  0x018  6      1200047924  ---  Logical Sectors Written
0x01  0x020  6         2860535  ---  Number of Write Commands
0x01  0x028  6      1608553599  ---  Logical Sectors Read
0x01  0x030  6         2008039  ---  Number of Read Commands
0x03  =====  =               =  ===  == Rotating Media Statistics (rev 1) ==
0x03  0x008  4             145  ---  Spindle Motor Power-on Hours
0x03  0x010  4             145  ---  Head Flying Hours
0x03  0x018  4              13  ---  Head Load Events
0x03  0x020  4               0  ---  Number of Reallocated Logical Sectors
0x03  0x028  4               2  ---  Read Recovery Attempts
0x03  0x030  4               9  ---  Number of Mechanical Start Failures
0x04  =====  =               =  ===  == General Errors Statistics (rev 1) ==
0x04  0x008  4               0  ---  Number of Reported Uncorrectable Errors
0x04  0x010  4               0  ---  Resets Between Cmd Acceptance and Completion
0x05  =====  =               =  ===  == Temperature Statistics (rev 1) ==
0x05  0x008  1              30  ---  Current Temperature
0x05  0x010  1              29  N--  Average Short Term Temperature
0x05  0x018  1               -  N--  Average Long Term Temperature
0x05  0x020  1              33  ---  Highest Temperature
0x05  0x028  1              19  ---  Lowest Temperature
0x05  0x030  1              31  N--  Highest Average Short Term Temperature
0x05  0x038  1              24  N--  Lowest Average Short Term Temperature
0x05  0x040  1               -  N--  Highest Average Long Term Temperature
0x05  0x048  1               -  N--  Lowest Average Long Term Temperature
0x05  0x050  4               0  ---  Time in Over-Temperature
0x05  0x058  1              60  ---  Specified Maximum Operating Temperature
0x05  0x060  4               0  ---  Time in Under-Temperature
0x05  0x068  1               0  ---  Specified Minimum Operating Temperature
0x06  =====  =               =  ===  == Transport Statistics (rev 1) ==
0x06  0x008  4             125  ---  Number of Hardware Resets
0x06  0x010  4             112  ---  Number of ASR Events
0x06  0x018  4               0  ---  Number of Interface CRC Errors
                                |||_ C monitored condition met
                                ||__ D supports DSN
                                |___ N normalized value

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
0x0009  2           20  Transition from drive PhyRdy to drive PhyNRdy
0x000a  2           19  Device-to-host register FISes sent due to a COMRESET
0x000b  2            0  CRC errors within host-to-device FIS
0x000d  2            0  Non-CRC errors within host-to-device FIS

# hdparm -tT /dev/sda

/dev/sda:
 Timing cached reads:   30620 MB in  1.99 seconds = 15374.86 MB/sec
 Timing buffered disk reads: 562 MB in  3.00 seconds = 187.20 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, 1,0 GiB) copied, 6,37302 s, 168 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, 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).

Como en todos los almacenamientos rotativos, existe una gran diferencia en la velocidad de lectura al operar con los primeros sectores respecto de los últimos: de casi 200 MB/s en los primeros sectores, a 100 MB/s en los últimos. La latencia de acceso ronda los 18 ms, variando entre 10 ms y 30 ms aprox.

$ bonnie++

(pendiente de realizar)

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

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

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