Come limitare un intero utente a meno del 10% della CPU, non solo elaborare?


10

Sto eseguendo centos, cpanel / whm e ho installato cpulimit.

Il problema che sto riscontrando è che uno dei miei utenti sta utilizzando una quantità estrema di utilizzo della CPU. Oltre il 100% in modo coerente e sta rallentando il mio server.

Un altro problema è che sono amici e non malvagi, quindi non voglio sospenderli.

Inoltre, il problema è che non posso limitarlo per processo, perché questo processo cambia ogni secondo. È un processo diverso ogni volta.

Ho provato quanto segue ma non funziona.

cpulimit -l 10 -e /home/[username]/public_html/theirwebsite.org/index.php

Sono appena tornato

No process found
No process found
No process found
No process found
No process found
No process found

eccetera

Ci sono due cose che stanno usando quell'uso estremo della cpu.

La prima cosa è il file in quella posizione, index.php. Altro è [php], qualunque cosa significhi in WHM. Ma soprattutto index.phpè il problema.

Se potessi limitare quel index.phpfile in quella posizione, ciò potrebbe aiutare a mitigare questo problema.

A proposito, ho provato la -Pbandiera ma non è disponibile come opzione a differenza della documentazione.

cpulimit -l 10 -P /home/[username]/public_html/theirwebsite.org/index.php

ritorna

cpulimit: invalid option -- 'P'
Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 1600 (required)
      -v, --verbose          show control statistics
      -z, --lazy             exit if there is no target process, or if it dies
      -i, --include-children limit also the children processes
      -h, --help             display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N            pid of the process (implies -z)
      -e, --exe=FILE         name of the executable program file or path name
      COMMAND [ARGS]         run this command and limit it (implies -z)

Quindi sembra che devo farlo con la -ebandiera.

Idealmente, tuttavia, vorrei limitare l'intero account utente.

E sì, lo so di cloudlinux ma non posso farlo adesso. Fino a quando non posso farlo ho bisogno di aiuto per farlo manualmente con qualcosa che non richiede il riavvio del server.

Risposte:


1

Hai ragione a dire che non puoi limitare il tuo amico usando un processo (PID), Apache genera un nuovo processo (lavoratore) per ogni richiesta che riceve, assegnando ogni volta un nuovo PID.

A seconda del gestore PHP configurato WHM -> MultiPHP Manager -> PHP Handlers, Apache eseguirà gli script PHP come se stesso o li eseguirà come utente proprietario del file. Se si utilizza suPHPcome gestore, il processo PHP verrà eseguito come dall'account proprietario del file.

Se lo script viene eseguito dal proprietario, è possibile limitare l'utilizzo della cpu a un account aggiungendolo al /etc/security/limits.conffile. Sebbene non sia possibile utilizzarlo per limitare esattamente la percentuale di CPU, è possibile modificare il loro valore "gradevole" in modo che i loro processi abbiano una priorità inferiore rispetto ad altri processi sul server. Pertanto, altri processi non dovranno attendere tanto.

Non l'ho mai usato da solo (eseguo CloudLinux), ma credo che la seguente voce dovrebbe aiutare con il problema:

username    hard    priority    30

Ciò imposta la massima priorità per i processi eseguiti dall'utente su 30. Da quanto ho capito, una priorità più alta significa in realtà che altri processi (con una priorità inferiore) ottengono più tempo della CPU.

Sul mio server che esegue cPanel, la maggior parte dei processi ha una priorità di 20, quindi seguendo la logica di cui sopra, impostando la priorità per quell'utente su 30 dovrebbe consentire l'esecuzione di altri processi prima di questi processi.


7

Hai provato Cgroups ?


  • Installa il servizio sudo yum install libcgroupe avvialo sudo service cgconfig start.
  • Dopodiché visualizza la configurazione del sottosistema per i cgroup eseguendo sudo ls /cgroup

Crea un cgroup chiamato limitcpu. Le linee che iniziano con il gruppo creano cgroups e impostano i parametri del sottosistema.

Esempio /etc/cgconfig.conf:

group limitcpu{

        cpu {
                cpu.shares = 200;
                # cpu.cfs_period_us
                # cpu.cfs_quota_us
        }
        memory {

        }
}

Per limitare la CPU ci sono un paio di parametri sintonizzabili che è possibile utilizzare per limitare l'utilizzo palese della CPU

Se le attività in un cgroup devono essere in grado di accedere a una singola CPU per 0,1 (10%) secondi ogni 1 secondo, impostare cpu.cfs_quota_us su 100000 e cpu.cfs_period_us su 1000000.


Cgred è un servizio (che avvia il servizio cgrulesengd) che sposta le attività in cgroups in base ai parametri impostati nel file /etc/cgrules.conf. Le voci nel file /etc/cgrules.conf possono assumere una di queste due forme:

user subsystems control_group
user:command subsystems control_group

Dove usercon un nome utente o un nome di gruppo con il prefisso "@". Sostituisci subsystemscon un elenco separato da virgole di nomi di sottosistemi, control_grouprappresenta un percorso per il cgroup e commandrappresenta un nome di processo o un percorso di comando completo di un processo.

Esempio etc / cgrules.conf:

*:firefox      cpu,memory      browsers/
@admin:memhog  memory          limitmem/
cpuhog         cpu             limitcpu/
  • firefoxi processi eseguiti da qualsiasi utente verranno automaticamente aggiunti ai browser cgroupe limitati nei sottosistemi CPU e memoria.

  • memhogi processi eseguiti da chiunque nel admingruppo verranno aggiunti al cgroup limitmeme limitati nel sottosistema di memoria.

    - Il tuo utente cpuhogverrà aggiunto al cgroup 'limitcpu' e limitato nei sottosistemi cpu.


In casi di utilizzo anticipato, puoi invece provare a utilizzare un modello.

Ad esempio, specificare il seguente modello in /etc/cgconfig.conf:

template users/%g/%u {
                     cpuacct{
                     }
                     cpu {
                        cpu.shares = "1000";
                     }
          }

Quindi utilizzare il modello users /% g /% u nella terza riga di una voce /etc/cgrules.conf, che può apparire come segue:

peter:ftp       cpu     users/%g/%u

Le %g and %uvariabili utilizzate in precedenza vengono automaticamente sostituite con il gruppo e il nome utente in base al proprietario del processo ftp.

Se il processo appartiene a peter dal gruppo adminstaff, il percorso precedente viene tradotto in users/adminstaff/peter.

Il servizio cgred cerca quindi questa directory e, se non esiste, cgred la crea e assegna il processo agli utenti / amministratori / peter / attività.

Si noti che le regole del modello si applicano solo alle definizioni dei modelli nei file di configurazione, quindi anche se "group users / adminstaff / peter" fosse definito in /etc/cgconfig.conf, verrebbe ignorato a favore di "users template /% g /% u".

Tutorial di Digital Ocean.

Introduzione ai gruppi di controllo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.