2014-10-16 24 views
13

Sto eseguendo un server Web che gestisce molte migliaia di connessioni di socket Web simultanee. Affinché ciò sia possibile, su Debian linux (la mia immagine di base è google/debian: wheezy, in esecuzione su GCE), dove il numero predefinito di file aperti è impostato su 1000, di solito basta impostare l'ulimit sul numero desiderato (64.000) .Docker Ignora limits.conf (tentando di risolvere l'errore "troppi file aperti")

Questo funziona alla grande, tranne per il fatto che quando ho implementato la mia applicazione e l'ho implementata, ho scoperto che il tipo di finestra mobile ignora le definizioni dei limiti. Ho provato la seguente (tutti sulla macchina host, non sul contenitore stesso):

MAX=64000 
sudo bash -c "echo \"* soft nofile $MAX\" >> /etc/security/limits.conf" 
sudo bash -c "echo \"* hard nofile $MAX\" >> /etc/security/limits.conf" 
sudo bash -c "echo \"ulimit -c $MAX\" >> /etc/profile" 
ulimit -c $MAX 

Dopo aver fatto qualche ricerca ho trovato che le persone sono state in grado di risolvere un problema simile in questo modo:

sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf" 

e riavviare/riavviare il servizio finestra mobile.

Tuttavia, tutto quanto sopra non riesce: sto ricevendo l'errore "troppi file aperti" quando la mia app viene eseguita all'interno del contenitore (facendo quanto segue senza finestra mobile risolve il problema).

Ho provato a eseguire ulimit -a all'interno del contenitore per ottenere un'indicazione se l'installazione di ulimit ha funzionato, ma così facendo si genera un errore su ulimit che non è un eseguibile che fa parte del PERCORSO.

Qualcuno si è imbattuto in questo e/o può suggerire un modo per ottenere docker per riconoscere i limiti?

risposta

9

ho potuto mitgiate questo problema con la seguente configurazione:

ubuntu ho usato 14.04 linux per la macchina finestra mobile e la macchina host.

Sulla ospite macchina, è necessario:

  • aggiornamento il /etc/security/limits.conf per includere: * - nofile 64000
  • aggiungere al vostro /etc/sysctl.conf: fs.file-max = 64000
  • restart sysctl: sudo sysctl -p
+4

Assicurati di riavviare anche il servizio daemon Docker! – cgp

1

Con docker-compose è possibile configurare ulimits.

https://docs.docker.com/compose/compose-file/#ulimits

È possibile aggiungere limiti di software/hardware come una mappatura.

ulimits: 
    nproc: 65535 
    nofile: 
    soft: 20000 
    hard: 40000 

Anche se non è l'ideale si potrebbe correre il contenitore con l'opzione privilegiata (soprattutto per una soluzione non ottimale veloce per un ambiente Dev, non è raccomandato se la sicurezza è una preoccupazione).

docker run --privileged 

consultare:

https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

+0

Questa è una pessima idea. –

2

È possibile passare il limite come argomento durante l'esecuzione del contenitore. In questo modo non devi modificare i limiti dell'host e dare troppa energia al contenitore.Ecco come:

docker run --ulimit nofile=5000:5000 <image-tag>