凤凰这么慢?请帮助改善其性能

时间:2016-04-22 23:07:34

标签: elixir phoenix-framework

我之所以学习灵丹妙药只是因为互联网上的很多文章都承诺它的响应时间不到一毫秒。我昨天构建了我的第一个应用程序,但我发现它的性能比rails更快。发生了什么?

让我解释一下我的应用。它实现了ecto-secure-password包提供的基本身份验证机制:

defmodule HelloPhoenix.User do
  use HelloPhoenix.Web, :model
  use SecurePassword

  schema "users" do
    field :first_name, :string
    field :last_name, :string
    field :username, :string

    has_secure_password
  end
end

这是我的控制人员:

defmodule HelloPhoenix.SessionController do
  use HelloPhoenix.Web, :controller

  def create(conn, %{ "session" => %{ "username" => username, "password" => password }}) do
    if user = HelloPhoenix.User.authenticate(HelloPhoenix.Repo.get_by(HelloPhoenix.User, username: username), password) do
      conn
      |> put_session(:user_id, user.id)
      |> json(UserSerializer.run(user))
    else
      conn
      |> put_status(422)
      |> json(%{})
    end
  end
end

所以,我使用这些命令:

MIX_ENV=prod mix compile
MIX_ENV=prod mix phoenix.server

失败的响应时间&成功的认证大约是~130ms,而轨道响应时间大约是150ms。我做错了什么?

3 个答案:

答案 0 :(得分:5)

它“慢”,因为密码散列函数(在这种情况下为bcrypt)故意慢,以避免暴力攻击。我不认为你应该担心它,因为你只需要在用户登录时散列,而不是每次请求。另一方面,攻击者每次尝试密码时都需要付出代价。

但是,建议在运行测试代码时减少轮次,因为在每个请求上创建用户会使测试速度变慢。慢速测试使开发人员不经常运行它们,这是不好的。

ecto-secure-password使用comeonin,因此,如果您想在测试环境中加快速度(在生产中使用它,因为它根本不安全) ,您可以将其配置为仅使用几轮。

将此附加到config / test.exs:

config :comeonin, :bcrypt_log_rounds, 4
config :comeonin, :pbkdf2_rounds, 1

瞧,生产是有保障的,而你的测试仍然很快(我的测试从15秒到<1秒)。

答案 1 :(得分:1)

comeonin库的v5版本开始,哈希实现已拆分为各个库,因此提供的配置将需要根据所使用的哈希库进行更改:

config :bcrypt_elixir, :log_rounds, 1

config :pbkdf2_elixir, :rounds, 1

config :argon2_elixir,
  t_cost: 1,
  m_cost: 8

答案 2 :(得分:-2)

我明白了。原因是bcrypt。我不知道为什么它很慢,但如果我把它从循环中删除,一切都很快