Cambiar la prioridad de los procesos en Linux

Si bien es posible lanzar procesos indicando la prioridad en Linux, existen casos en los que necesitamos cambiar la prioridad de un proceso en ejecución. Para eso existe el comando renice.

renice [-n] <niceness> [-p|-g|-u] <identificadores>

donde identificadores se corresponde con:

  • un conjunto de ids de proceso (pid) si no se especifica parámetro o se precede por -p
  • un conjunto de id de grupo de proceso si se precede por -g
  • un conjunto de usuarios si se precede por -u.

Los usuarios que no sean el superusuario sólo pueden bajar la prioridad de sus procesos, es decir, aumentar su niceness (en el rango de 0 a 19). El superusuario (root) puede ajustar la prioridad de cualquier proceso usando un valor nice del rango completo (-20 a 19).

Ejemplo

Suponiendo que se está importando una base de datos y este proceso está consumiendo mucha CPU, obtenemos su PID (process id) mediante top o pgrep, y le bajamos la prioridad ejecutando desde la consola

$ renice +5 2119
2119 (process ID) old priority 0, new priority 5

Podemos repetir la operación, si la prioridad establecida no fuera suficientemente baja:

$ renice +7 2119
2119 (process ID) old priority 5, new priority 7

De esta manera, es posible que el proceso demore un poco más en terminar su ejecución, pero al mismo tiempo, otros tendrán más CPU disponible.


Ahora bien, si después de un rato vemos que no se concretara, podríamos intentar incrementar su prioridad haciendo:

$ renice 0 2119
renice: failed to set priority for 2119 (process ID): Permission denied

Esta acción falla debido a que para bajar el valor nice es necesario ser superusuario:

$ sudo renice 0 2119
2119 (process ID) old priority 10, new priority 0

Solo con el superusuario podemos establecer un niceness < 0:

$ sudo renice -5 2119
2119 (process ID) old priority 0, new priority -5

También te puede interesar:

Cambiar la prioridad de un proceso en Windows

Prioridades en Linux

Cuando ejecutamos un proceso, es el sistema operativo quien determina la planificación y asignación de recursos al mismo, entre ellos, el tiempo de CPU.

Mendiante el comando top podemos ver los procesos en ejecución

 PID USER  PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 838 us1   20   0  479476 117116  56872 S  4,7  5,7   1:02.12 Xorg   
1867 us1   20   0 1808172 255376 129456 S  2,0 12,5   0:11.70 firefox
2211 us1   20   0  751108  45624  30484 S  1,7  2,2   0:00.63 gedit  
 627 root  20   0    4552    840    776 S  0,3  0,0   0:00.01 acpid  
2226 us1   20   0   51184   4232   3604 R  0,3  0,2   0:00.13 top    
   1 root  20   0  159892   8956   6528 S  0,0  0,4   0:01.76 systemd

De toda la información presentada nos enfocamos en 2 columnas:

NI (niceness): valor de prioridad vinculado al usuario. El rango del valor nice comprende desde -20 (el mayor) a +19 (el menor).

PR (priority): prioridad del proceso para el kernel del linux. El rango de prioridades comprende desde  0 a 139, siendo

  • de 0 a 99 para tiempo real (‘rt’ en la salida de top)
  • de 100 a 139 para los usuarios (rango 0 a 39 en la salida de top)

La relación entre ambos es la siguiente:

PR = 20 + NI

Es por ello que el rango de PR = 20 + (-20 a +19) es 0 a 39.

El valor de nice, por defecto, para un proceso es heredado de su padre, y por lo general, es 0 (la prioridad correspondiente es 20). Es posible especificar un valor de nice para cambiar la prioridad de un proceso en ejecución o bien lanzar un proceso con una prioridad diferente.

Basado en:

https://askubuntu.com/questions/656771/process-niceness-vs-priority

Alternativa a UPDATE ON DUPLICATE KEY DELETE en MySQL

Lamentablemente, la sentencia expuesta en el título de esta publicación no existe en Mysql. No es posible borrar el registro luego de un UPDATE que genere un duplicado, en la misma sentencia.

La alternativa disponible es utilizar UPDATE IGNORE y luego ejecutar DELETE sobre los registros que fueron ignorados.

Ejemplo

Supongamos que existe la tabla ‘insumos_rubros’ con la asociación entre cada insumo y los rubros a los que pertenece, la cual posee una clave primaria compuesta por los 2 campos: id_insumo y id_rubro.

Al intentar cambiar todos los insumos de un rubro a otro se puede generar un registro duplicado, dado que algunos de ellos podrían haber estado asociados previamente al rubro destino:

mysql> UPDATE insumos_rubros SET id_rubro = 26 WHERE id_rubro = 13;
ERROR 1062 (23000): Duplicate entry '9-26' for key 'PRIMARY'

Rápidamente se nos viene a la mente un intento de solución:

mysql> UPDATE insumos_rubros SET id_rubro = 26 WHERE id_rubro = 13
    -> ON DUPLICATE KEY DELETE;

el cual hubiera generado un error de sintaxis debido a ‘ON DUPLICATE KEY DELETE’.

Aplicando la alternativa de UPDATE IGNORE y luego DELETE sobre los registros que fueron ignorados

mysql> UPDATE IGNORE insumos_rubros SET id_rubro = 26 WHERE id_rubro = 13;
Query OK, 65 rows affected (0.00 sec)

mysql> DELETE FROM insumos_rubros WHERE id_rubro = 13;
Query OK, 3 rows affected (0.00 sec)

logramos el objetivo deseado.

Basado en:

Utilizar los valores indicados en INSERT dentro de ON DUPLICATE KEY UPDATE en MySQL

Una de las alternativas para tratar los registros duplicados en un INSERT de MySQL es utilizar INSERT … ON DUPLICATE KEY UPDATE.  En ciertos casos es necesario actualizar los registros duplicados a partir de los valores que se han indicado en el INSERT, especialmente en una sentencia INSERT de múltiples registros (BULK INSERT).

Para ello existe la función VALUES(columna) que aplicada dentro de la cláusula UPDATE, en el caso de duplicate key, referencia al valor de ‘columna’ que habría sido insertado si no hubiera ocurrido el conflicto.

Ejemplo

Suponiendo que la tabla ‘stock’ posee la cantidad de cada item que se vende en una tienda y tiene un índice UNIQUE por el campo ‘insumo’, al agregar registros:

mysql> INSERT INTO stock (insumo,cant) VALUES ('pañuelos',4), ('corbatas',2)
     -> ON DUPLICATE KEY UPDATE cant=cant+VALUES(cant);

en caso de que ya existiera uno previo para cierto item, se incrementa su stock en la cantidad indicada.

Atención: La función VALUES() solo tiene significado dentro de sentencias INSERT... UPDATE y retorna NULL en cualquier otro caso.

Recuperar espacio en disco en Windows

Windows almacena mucha información de uso y de copias de seguridad que rara vez utilizamos. Siempre es bueno contar con un respaldo en caso de que algo falle, pero con el paso del tiempo el consumo de espacio en disco se hace excesivo y es entonces cuando podemos aplicar una limpieza.

La herramienta que Windows provee para ello es el Liberador de espacio en disco, el cual podemos lanzar desde Inicio > Ejecutar… escribiendo:

cleanmgr

Entre las opciones que provee, las que más consumen espacio son

  • Archivos temporales de Internet
    • utilizados por Internet Explorer
  • Papelera de reciclaje
    • Todo lo que vamos borrando
  • Archivos de copia de seguridad del Service Pack
    • generados a partir de una actualización del sistema con un Service Pack
  • Archivos temporales
    • generados por instalación y uso de diferentes aplicaciones
  • Archivos de Informes de error de Windows
    • Registros de errores que en algún caso podrían asistir a diagnóstico de problema

Ninguna de ellas es esencial para el uso del sistema y se pueden recuperar valiosos bytes para otras tareas.

Atajo para acceder a todas las tareas del Panel de Control en Windows

En las diferentes versiones de Windows a partir de Windows 7, existe la posibilidad de acceder a una carpeta especial que contiene todas las tareas que normalmente están disponibles navegando el Panel de Control, o haciendo una búsqueda dentro del mismo.

A esta carpeta se la conoce como Todas las tareas, o en inglés, All tasks y puede accederse desde Inicio > Ejecutar… (Win + R) escribiendo:

shell:::{ED7BA470-8E54-465E-825C-99712043E01C}

Alternativamente, si fuera necesario tenerla siempre disponible, se puede crear una carpeta con el nombre que uno quiera y a continuación del mismo agregar “.{ED7BA470-8E54-465E-825C-99712043E01C}”. Por ejemplo:

All tasks.{ED7BA470-8E54-465E-825C-99712043E01C}

Al confirmar la acción, solo quedará visible el nombre indicado y el icono de la carpeta será reemplazado por el icono del Panel de Control.

Basado en:

Encontrar los archivos más grandes en Google Drive

En la Vista de Lista de Google Drive, existe la columna Tamaño del archivo. Por alguna razón, no podemos ordenar el contenido de la carpeta según esa columna.

Lo más cercano a ello es acceder al apartado Almacenamiento mediante la url:

https://drive.google.com/drive/quota

También es posible llegar a partir de un vínculo que se presenta en la esquina inferior izquierda de la pantalla sobre el texto “X GB de Y GB utilizado(s)

En este listado, se presentan todos los archivos de nuestra cuenta de Google Drive que consumen espacio. El orden por defecto es descendente por tamaño,  es decir, los más grandes al principio. Se puede aplicar el orden ascendente por la misma columna y no mucho más.

Basado en:

https://www.labnol.org/internet/google-drive-sort-files-by-size/28745/