Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

matheusbattisti

Diferença de performance de uma aplicação com cenários idênticos

Recommended Posts

Neste fim de semana fizemos deploy de uma aplicação com base no framework Magento, que foi exaustivamente testada em vários cenários, com alta carga de usuários fazendo várias requisições ao banco de dados, como consultas, atualizações e inserções, todo o percurso dos clientes finais foi simulado.

Nos testes as configurações eram idênticas as que estavam na hora do deploy, a única diferença era o subdomínio, que estavamos usando um de homologação e depois apontamos para o www, e para nossa surpresa a aplicação ficou totalmente instável, apresentando erros de banco de dados, na verdade apenas um erro:

MySQL error 2006: mysql server has gone away

Este erro ocorreu em diversas tabelas, e na aplicação de testes não ocorreu nem uma vez, com 50 usuários simultâneos fazendo compras, e na hora do deploy estavamos com 20 usuários (segundo o analytics).

A configuração da infra é:

- 2 Web servers
- 1 File server
- RDS
- Servidor para Redis

A pergunta é: Como é possível que em casos idênticos de configuração a aplicação se comportou tão diferente? o subdomínio tem alguma influência nisto?

Obs: se precisarem de mais detalhes, favor solicitar

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Dificilmente esse problema seja de performance, ainda mais com os testes que você citou, de 20 ou 50 usuários simultâneos, pois esse número não é tão grande. Além disso você disse que estava rodando sem problemas em outro domínio.

Você está usando qual máquina da AWS? t2.nano? Pois creio que qualquer máquina superior à ela suporte tranquilo essa quantidade de usuários, mas não custa testar uma máquina mais forte para ver se há diferença.

 

Você citou que está usando a RDS, e por isso eu assumo que sua arquitetura esteja toda na AWS. Como você está rodando as máquinas da aplicação? Diretamente com o EC2, com ElasticBeanstalk ou com outro serviço, como o ECS (Docker)?

Você deve saber, mas não custa lembrar que o ElasticBeanstalk possui um leque de variáveis que podem ser definidas e alteram o comportamento da sua aplicação, através das ebextensions. Um exemplo de definição que pode ser feita é:

option_settings:
  aws:elasticbeanstalk:container:php:phpini:
    document_root: '/public'
    memory_limit: '256M'
    zlib.output_compression: 'On'
    allow_url_fopen: 'On'
    display_errors: 'Off'
    max_execution_time: 60

 

Se você utiliza o Composer, deveria indicar que a instalação é para produção e quer otimizar o autoloader, assim:

option_settings:
  aws:elasticbeanstalk:container:php:phpini:
    composer_options: '--no-dev --optimize-autoloader'

 

Como surgem problemas relacionados ao banco, não custa perguntar também: qual máquina você está usando no RDS? Já tentou aumentar o poder computacional dela? Pois pelo erro reportado, quem está com problemas em atender às requisições é o banco. 

 

1 hora atrás, matheusbattisti disse:

o subdomínio tem alguma influência nisto?

Aí que tá, não deveria ter influência nenhuma.

Meu maior palpite é algum problema relacionado à rede/dns/vpc. Talvez no seu novo deploy você tenha esquecido de dar acesso ao RDS ou outro serviço à máquina nova de produção.

 

Você podia também rodar um benchmark temporário (na máquina de produção mesmo) para ver se encontra o ponto específico que está causando problemas. Aconselho fortemente dar uma olhada no blackfire. É bem fácil rodar ele.

 

Boa sorte...

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por ILR master
      Fala galera, tudo certo?
       
      Seguinte: No servidor A estou tentando fazer uma consulta com o servidor B, mas está dando erro.
      Estou usando o mesmo código de conexão do servidor B que funciona perfeitamente, mas no servidor A, dá erro.
      Segue código:
       
      $host = 'servidor B';
      $user = 'user';
      $pass = '********';
      $db   = 'banco';
       
      // conexão e seleção do banco de dados
      $conexao = mysqlI_connect($host, $user, $pass, $db);
      mysqlI_set_charset($conexao,"utf8");
      //print "Conexão rodando e OK!"; 
      //mysqlI_close($conexao);
       
      Alguém pode me ajudar?
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.