用于 php 会话处理的 Slow DynamoDB


Slow DynamoDB for php session handling

我们使用 DynamoDB 来同步 ELB 下多台 EC2 机器之间的会话。

我们注意到这种方法会减慢脚本的速度。

具体来说,我制作了一个 js,它在服务器上调用 10 次 3 个不同的 php 脚本。

1)第一个只是一个回显时间戳();往返时间约为 50 毫秒。2)第二个是PHP脚本,通过mysqli连接到RDS MySQL,需要相同的时间(约50-60ms)。3) 第三个脚本使用 AWS 官方文档中描述的 DynamoDB 会话保存方法,大约需要 150 毫秒(慢 3 倍!!

我每天晚上都在清理垃圾(如文档所述),DynamoDB 指标似乎还可以(附在下面)。

我使用的代码是这样的:

use Aws'DynamoDb'DynamoDbClient;
use Aws'DynamoDb'Session'SessionHandler;
ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");
ini_set('session.gc_probability', 0);
require 'aws.phar';
$dynamoDb = DynamoDbClient::factory(array(
    'key'    => 'XXXXXX',
    'secret' => 'YYYYYY',
    'region' => 'eu-west-1'
));
$sessionHandler = SessionHandler::factory(array(
    'dynamodb_client' => $dynamoDb,
    'table_name'      => 'sessions',
    'session_lifetime'         => 259200,
    'consistent_read'          => true,
    'locking_strategy'         => null,
    'automatic_gc'             => 0,
    'gc_batch_size'            => 25,
    'max_lock_wait_time'       => 15,
    'min_lock_retry_microtime' => 5000,
    'max_lock_retry_microtime' => 50000,
));
$sessionHandler->register();
session_start();

我做错了什么,还是一直检索会话是正常的?

谢谢。

在 AWS

论坛中复制 AWS 工程师的通信:https://forums.aws.amazon.com/thread.jspa?messageID=597493

这里有几件事要检查:

  1. 您是否在与 DynamoDB 表位于同一区域的 EC2 上运行应用程序?
  2. 您是否启用了 OPcode 缓存,以确保 SDK 使用的类不需要每次从磁盘加载和解析 脚本是否正在运行?

使用 Apache 等 Web 服务器并连接到 DynamoDB 会话 将需要在每个请求上建立新的 SSL 连接。 这是因为PHP目前不允许你重用cURL 请求之间的连接句柄。某些数据库驱动程序确实允许 对于请求之间的持久连接,这可能说明 性能差异。

如果您跟进 AWS 论坛主题,AWS 工程师应该能够帮助您解决问题。如果要使此线程保持打开状态,也会对其进行监视。