¿Copia lenta de archivos a memorias USB?

Saturday 6 de April de 2013, 7:50 am 37 Comments

Algo que me encanta de ArchLinux es que cada vez que me enfrento a un problema, siempre encuentro información al respecto en la wiki y/o en los foros; desde el primer día en que empecé a utilizar esta maravillosa distro, todos los días he aprendido algo nuevo… y esta ocasión no es la excepción.

El problema: Pobre desempeño al copiar o mover archivos (en particular los “pesados”, pero no es exclusivo) a una memoria USB o pendrive, en especial al usar KDE (de nuevo, el Desktop Environment tampoco es exclusivo).

La solución: En la wiki se menciona un procedimiento, pero editando el archivo /etc/rc.local, el cual sabemos ya no existe con la llegada de systemd, así que tuve que “modernizarlo” basándome en un par de guías. El resultado a continuación.

Paso 0

No usen sudo para crear/editar los archivos de los pasos siguiente, mejor entren al usuario root con el comando su -:

[gespadas@localhost ~]$ su -
Contraseña: ******
[root@localhost ~]#

Ahora si, pueden seguir leyendo.

Paso 1

Vamos a crear el archivo /etc/tmpfiles.d/disable-hugepage.conf (realmente puede llamarse como gusten). Para ello usaré:

vim /etc/tmpfiles.d/disable-hugepage.conf

¿No les gusta vim? ¡Muy mal! Ok ok, pueden usar el editor que deseen ;-)

Ahí, el contenido del archivo será el siguiente:

w /sys/kernel/mm/transparent_hugepage/enabled - - - - madvise
w /sys/kernel/mm/transparent_hugepage/defrag - - - - madvise
w /sys/kernel/mm/transparent_hugepage/khugepaged/defrag - - - - 0

Las primeras dos líneas están escribiendo el valor madvise al archivo indicado (algo como hacer un echo madvise > /sys/.../archivo), y la última línea hace lo mismo, pero escribiendo el valor 0.

No quiero profundizar en lo que significa lo anterior (¡lean las referencias que pongo!), pero brevemente les comento que estamos estableciendo durante el booteo (por eso usamos tmpfiles) los parámetros transparent hugepages y hugepage defragmentation del kernel.

Paso 2

Adicionalmente, editen el archivo /etc/sysctl.conf (ese si existe, su función es la de establecer parámetros del kernel en tiempo de ejecúción):

vim /etc/sysctl.conf

Y al final pongan lo siguiente:

kernel.shmmax=134217728
vm.dirty_background_bytes = 4194304
vm.dirty_bytes = 4194304

¿Por qué esos números? 134,217,728 bytes = 128 MB y 4,194,304 bytes = 4 MB.

¿Y por qué esos parámetros? Ayudan a reducir el efecto freeze en KDE.

¿Les da miedo editar un archivo que se mete directamente con el kernel? ¡Deberían! Es por eso que una solución más elegante, más acorde a la filosofía de systemd, es crear un archivo .conf dentro de la carpeta /etc/sysctl.d/ (similar a lo que hicimos en el paso 1). Por ejemplo, el archivo podría llamarse /etc/sysctl.d/disable-freeze.conf, cuyo contenido serían las tres líneas antes descritas.

Paso Extra

Si el desempeño mejoró, pero no lo suficiente, repitan el paso 1, pero usando el valor never en vez de madvise. ¡Atención! Hay efectos colaterales, y el más molesto es que la hibernación del sistema ya no funcionará.

Share

Post tags