AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1167527
Accepted
NicoAdrian
NicoAdrian
Asked: 2024-11-07 23:12:46 +0800 CST2024-11-07 23:12:46 +0800 CST 2024-11-07 23:12:46 +0800 CST

Varnish número muito alto de arquivos abertos

  • 772

Aqui está minha configuração do Varnish:

/usr/sbin/varnishd \
      -a 127.0.0.1:6081 \
      -T 127.0.0.1:6082 \
      -f /varnish/default.vcl \
      -P %t/%N/varnishd.pid \
      -s malloc,4G \
      -p thread_pools=12 -p thread_pool_min=250 -p default_ttl=1 -p default_grace=0 -p timeout_idle=1800

Então 12 * 250 = 3000 threads. Com essa configuração, acabo com mais de 400k arquivos abertos.

Reduzir o número de threads ao mínimo realmente reduz muito o número de arquivos abertos.

A questão é: como isso é possível? É normal que cada thread do Varnish ocupe tantos arquivos abertos?

EDIT: Aqui está meu arquivo VCL:

vcl 4.1;

backend someBackend {
    .host = "someBackend.net";
    .connect_timeout = 2s;
    .first_byte_timeout = 5s;
    .between_bytes_timeout = 5s;
}

sub vcl_recv {
    # Remove Varnish from X-Forwarded-For (set by Nginx)
    set req.http.X-Forwarded-For = regsub(req.http.X-Forwarded-For, ",[^,]+$", "");
}

sub vcl_backend_fetch {
    # Hide Varnish token
    unset bereq.http.X-Varnish;
}

sub vcl_backend_response {
    unset beresp.http.Vary;
}

sub vcl_deliver {
    unset resp.http.Via;
    unset resp.http.X-Varnish;
}
varnish
  • 1 1 respostas
  • 112 Views

1 respostas

  • Voted
  1. Best Answer
    Thijs Feryn
    2024-11-07T23:46:51+08:002024-11-07T23:46:51+08:00

    Alguns dos parâmetros que você definiu podem ser responsáveis ​​por esse alto número de arquivos abertos.

    Tópicos

    Vamos começar com thread_pools=12. O valor padrão é 2 e não aconselhamos que você o altere. Enquanto thread_pool_minestiver definido como 250em seu caso de uso, o valor padrão para thread_pool_maxé 5000.

    A questão é: "você está vendo 400 mil arquivos abertos durante o pico de tráfego ou mesmo quando está bem abaixo de 1.000 tópicos ativos?"

    Para sua informação: o MAIN.threadscontador varnishstatpode ajudar você a descobrir quantos tópicos ativos existem.

    Digamos hipoteticamente que isso esteja acontecendo durante o pico absoluto de tráfego, quando você tem 5.000 threads por pool, mas os 12 pools de threads resultam em 60.000 threads ativos.

    Isso significaria que haveria cerca de 7 descritores de arquivo por thread, o que não é absurdo.

    O impacto detimeout_idle

    É claro que há o timeout_idleparâmetro que você aumentou de 5 para 1800. Isso significa que uma conexão fica ociosa por 1800 segundos antes de ser fechada se keepalive estiver definido.

    Isso é muito tempo.

    Os descritores de arquivo para conexões ociosas são movidos para longe dos threads e são gerenciados por um thread waiter . Isso significa que os descritores de arquivo são mantidos por perto, enquanto os threads podem assumir novas conexões e criar mais descritores de arquivo.

    Para sua informação: você pode executar varnishstat -f "WAITER.*.conns" -f "MAIN.sess_conn" -f "MAIN.backend_conn"para monitorar conexões que são manipuladas pelo thread de espera, conexões de entrada regulares e conexões de backend.

    Mais alguma depuração necessária

    Ao longo da minha resposta, presumi que os 400k arquivos abertos ocorrem durante o pico de tráfego. Se esse não for o caso, há mais depuração necessária para descobrir quais arquivos (ou descritores de arquivo) estão em uso.

    Uma maneira de fazer isso é executar o seguinte comando:

    lsof -p $(pgrep cache-main)
    

    Este comando listará os vários descritores de arquivo que estão em uso para esse processo.

    E, claro, executando o seguinte comando com parâmetros combinados para listar todos os threads e conexões:

    varnishstat -f "MAIN.threads" -f "WAITER.*.conns" -f "MAIN.sess_conn" -f "MAIN.backend_conn"
    

    Atualização após comentários

    Na seção de comentários desta pergunta, você notará algumas idas e vindas na tentativa de reunir mais informações e obter algum contexto.

    @NicoAdrian mencionou que estava vendo muitos descritores de arquivo apontando para var/lib/varnish/varnishd/_.vsm_child/_.Stat.*. Não consegui simular isso. Sempre que inicio, varnishdhá cerca de 45 descritores de arquivo associados a esse padrão.

    Quando aumento as configurações de threading para os parâmetros que foram compartilhados aqui, esse número aumenta para 80, mas não mais.

    No entanto, posso simular o alto número de descritores de arquivo ao aumentar as configurações de threading.

    Executei os seguintes comandos em um servidor Varnish em execução para imitar as configurações mencionadas nesta pergunta:

    varnishadm param.set thread_pools 12
    varnishadm param.set thread_pool_min 250
    

    A saída de lsof | grep "varnish" | wc -lfoi 188918. Isso significa que 188918 descritores de arquivo estavam em uso.

    Enquanto isso, a saída de varnishstat -1 -f MAIN.threadsmostra que 3198os threads de trabalho estão ativos naquele momento. Isso é 12 x 250.

    250 threads de trabalho por pool de threads é o mínimo com essas configurações. Conforme o tráfego começa a aumentar, os threads por pool podem ir até 5000, porque o valor padrão de thread_pool_maxé 5000.

    Há em média 50-60 descritores de arquivo por thread de trabalho. Ao ter um alto número de threads ativas, esses descritores de arquivo aumentarão na mesma proporção. A maioria deles deve ser vinculada a /proc/*.

    Conforme mencionado, o número de pools de threads foi aumentado para 12 para diminuir a contenção de bloqueio. Dificilmente aumentamos o valor de thread_pools, mesmo para sistemas em escala. No caso de 12 pools de threads, pode fazer sentido diminuir o thread_pool_minvalor para reduzir a criação inicial de threads e reduzir os descritores de arquivo em uso.

    No tráfego de linha de base, faz sentido olhar para para MAIN.threadsver quantos threads estão realmente sendo criados. Se esse valor for maior que thread_pools x thread_pool_min, é uma indicação de que mais threads foram criados e que a thread_pool_minconfiguração estava muito baixa.

    Isso tem uma correlação direta com o número de descritores de arquivo em uso. Se houver suspeita de que o desempenho se torne um problema por causa disso, é possível montar a /var/lib/varnishpasta em tmpfs.

    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve