GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué se ignora el nivel Niza? (entre diferentes sesiones de inicio de sesión:se respeta si se inició desde la misma sesión)?

Cuando inicio dos procesos que consumen CPU con diferentes niveles de Niza, por ejemplo,

Proceso 1:

nice -19 sh -c 'while true; do :; done'

Proceso 2:

sh -c 'while :; do true; done'

(Cambié el orden de : y true solo para diferenciar los procesos en las salidas de ps o top ),

el nivel agradable parece ignorarse y ambos usan la misma cantidad de CPU.

La salida de top es como

  PID USER      PR  NI    VIRT    RES %CPU %MEM     TIME+ S COMMAND
 8187 <user>    39  19   21.9m   3.6m 45.8  0.0   0:20.62 R sh -c while true; do :; done
 8188 <user>    20   0   21.9m   3.5m 45.6  0.0   0:20.23 R sh -c while :; do true; done
 [...]

(por supuesto, el %CPU -los valores varían ligeramente de una muestra a otra, pero en promedio parecen iguales).

top muestra que ambos procesos se ejecutan con diferentes valores agradables, pero aun así parecen obtener la misma cantidad de tiempo de CPU.

Ambos comandos fueron ejecutados por el mismo usuario desde diferentes terminales (ambos son shells de inicio de sesión).

Si se ejecutan desde el mismo terminal, se comportan como se esperaba:el mejor proceso deja paso al no tan bueno.

¿Cuál es la razón? ¿Cómo hacer un buen trabajo globalmente en toda la máquina?

Era diferente en esa misma máquina hace un tiempo, donde parecían respetarse los buenos valores.

Es una máquina de un solo procesador/un solo núcleo.

Para información:

  • Kernel:Versión 4.4.5 (kernel estándar de Arch Linux); uname -r :4.4.5-1-ARCH ,
  • /proc/cpuinfo es:

    processor       : 0
    vendor_id       : GenuineIntel
    cpu family      : 6
    model           : 23
    model name      : Intel(R) Core(TM)2 Solo CPU    U3500  @ 1.40GHz
    stepping        : 10
    microcode       : 0xa0c
    cpu MHz         : 1400.000
    cache size      : 3072 KB
    physical id     : 0
    siblings        : 1
    core id         : 0
    cpu cores       : 1
    apicid          : 0
    initial apicid  : 0
    fpu             : yes
    fpu_exception   : yes
    cpuid level     : 13
    wp              : yes
    flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts nopl aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm tpr_shadow vnmi flexpriority
    bugs            :
    bogomips        : 2794.46
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 36 bits physical, 48 bits virtual
    power management:
    

Respuesta aceptada:

Ah, no es la función systemd-logind donde cada usuario obtiene su propio cgroup. Creo que el cambio responsable aquí es más antiguo; simplemente son confusamente similares. (Busqué "programación justa de grupos de procesos", pensando que podría ser algo basado en los "grupos de procesos" de Unix que realmente nunca entiendo). Wikipedia:

El kernel de Linux recibió un parche para CFS en noviembre de 2010 para el kernel 2.6.38 que ha hecho que el programador sea más justo para usar en escritorios y estaciones de trabajo.

Cuando una tarea llama a __proc_set_tty(), se elimina la referencia amplia del proceso al grupo predeterminado, se crea un nuevo grupo de tareas y el proceso se mueve al nuevo grupo de tareas. A partir de entonces, los hijos heredan este grupo de tareas y aumentan su refcount. Al salir, se descarta una referencia al grupo de tareas actual cuando se elimina la última referencia a cada estructura de señal. El grupo de tareas se destruye cuando se libera la última estructura de señal que hace referencia a él. En el momento de la selección de la cola de ejecución, si una tarea no tiene asignación de cgroup, se utiliza su grupo automático actual.

La función está habilitada desde el arranque de forma predeterminada si se selecciona CONFIG_SCHED_AUTOGROUP, pero se puede desactivar a través de la opción de arranque noautogroup, y también se puede activar/desactivar sobre la marcha [a través de /proc/sys/kernel/sched_autogroup_enabled :Escribiendo allí lo deshabilita para tareas de nueva creación, escribiendo 1 lo habilita.]

Los principales problemas resueltos por esto son para sistemas multi-core y multi-cpu (SMP) que experimentan mayores tiempos de respuesta interactivos mientras realizan otras tareas que usan muchos subprocesos en esas tareas. Una explicación simple es que uno podrá ver un video, leer un correo electrónico y realizar otras actividades típicas de escritorio sin fallas ni interrupciones mientras compila el kernel de Linux o un proceso similar, como la codificación de video. Sin embargo, hay objeciones a esta declaración.


Linux
  1. ¿Por qué Cd no es un programa?

  2. Grep:¿por qué los corchetes en el patrón Grep eliminan el proceso Grep de los resultados de Ps?

  3. ¿Por qué el carácter comodín * es tan diferente entre los comandos Zip y Rm?

  4. ¿Iniciar un proceso en un Tty diferente?

  5. ¿Por qué Ls -l produce un tamaño diferente de Ls -s?

Primeros pasos con Tmux

Eliminar la sesión INVITADA de la pantalla de inicio de sesión de Ubuntu

Reptyr:mueva un proceso en ejecución de una terminal a otra sin cerrarlo

¿Cuándo es útil setsid() o por qué necesitamos agrupar procesos en Linux?

CURL para acceder a una página que requiere un inicio de sesión desde una página diferente

No se puede separar el proceso secundario cuando el proceso principal se inicia desde systemd