Domanda

Quando si esegue proc_nice (), è in realtà nice'ing filo di Apache?

Se è così, e se l'utente corrente (non-super utente) non può renice alla sua priorità originale sta uccidendo il filo appropriata Apache (apache_child_terminate) su un server Apache 2.0x?

Il problema è che sto cercando di limitare l'impatto di un app che permette all'utente di eseguire query ad-Hack. Le query possono essere massiccia e la risultante di trasformare sui dati richiede un sacco di memoria e CPU.

Ho già ri-scritto il processo per essere più flusso di base - aiutando con il consumo di memoria, ma vorrei anche il processo per eseguire una priorità più bassa. Tuttavia non posso lasciare il filo Apache in bassa priorità come abbiamo un sacco di servizi web ad alta priorità in esecuzione su questa stessa scatola.

TIA

È stato utile?

Soluzione

In questo tipo di situazione, una soluzione anche se spesso di non fare questo tipo di lavoro pesante all'interno dei processi di Apache, ma o:

  • eseguire un processo di PHP esterna, usando qualcosa come shell_exec , per esempio - questo è se si deve lavorare in modalità sincrona (cioè, se non è possibile eseguire l'operazione un paio di minuti più tardi)
  • spingere il compito di un sistema FIFO, e subito restituito un messaggio per l'utente che dice "il vostro compito sarà processata presto"
    • e avere qualche altro processo (lanciato tramite un crontab ogni minuto, per esempio) controllare che coda FIFO
    • e fare il trattamento che ci sia qualcosa in coda
    • Tale processo, si può eseguire in modalità a bassa priorità.


Il più spesso possibile, soprattutto se i calcoli pesanti richiedere un certo tempo, vorrei andare per la seconda soluzione:

  • Esso consente agli utenti di ottenere un feedback subito: "il server ha ricevuto la tua richiesta, ed elaborerà presto"
  • Non evitare che i processi di Apaches "lavorare" per molto tempo: la roba pesante è fatto da altri processi
  • Se, un giorno, si ha bisogno di una tale quantità di potenza di elaborazione che un server non basta più, questo tipo di sistema sarà più facile da scalare: basta aggiungere un secondo server che prenderete dalla coda stessa FIFO
  • Se il server è davvero troppo caricato, è possibile interrompere l'elaborazione dalla coda, almeno per qualche tempo, in modo che il carico può ottenere una migliore - per esempio, questo può essere utile se il vostro web-servizi critici sono utilizzati un sacco di una determinata arco di tempo.


Un altro (bello da vedere, ma non ho ancora provato) soluzione sarebbe quella di utilizzare una sorta di strumento come, per esempio, Gearman :

  

Gearman fornisce un'applicazione generica   quadro ai campi di lavori ad altri   macchine o processi che sono meglio   adatto per fare il lavoro.
Esso consente   fare un lavoro in parallelo, per caricare   equilibrio di trasformazione, e di chiamare   funzioni tra le lingue.
Può essere   utilizzato in una varietà di applicazioni,   da siti web ad alta disponibilità a   il trasporto di replica di database   eventi.
In altre parole, è il   sistema nervoso per come distribuita   elaborazione comunica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top