如何使用 AWS EC2 减少 time_starttransfer (TTFB)

问题描述

我的网站在 AWS EC2 上。

我用这个命令检查了 TTFB(第一个字节的时间):

curl --output /dev/null --silent --write-out "time_namelookup=%{time_namelookup}\ntime_connect=%{time_connect}\ntime_appconnect=%{time_appconnect}\ntime_pretransfer=%{time_pretransfer}\ntime_redirect=%{time_redirect}\ntime_starttransfer=%{time_starttransfer}\ntime_total=%{time_total}\n" --url http://13.37.46.163/

这是在我的计算机上运行命令时的结果:

time_connect=0,014614
time_appconnect=0,000000
time_pretransfer=0,014657
time_redirect=0,000000
time_starttransfer=0,119092
time_total=0,134436

这是我在网络服务器上运行命令时的结果:

time_namelookup=0.000058
time_connect=0.001296
time_appconnect=0.000000
time_pretransfer=0.001336
time_redirect=0.000000
time_starttransfer=0.084576
time_total=0.085031

我注意到在这两种情况下,最长的时间是time_starttransfer。 我怎样才能减少这个时间?

什么是time_starttransfer?

从开始到第一个字节即将被传输所用的时间,以秒为单位。这包括 time_pretransfer 以及服务器计算结果所需的时间。

我的网站配置

我的网站链接是:http://13.37.46.163/

这是一个 Grav CMS 使用 EC2 + ServerPilot + PHP7

运行的女巫

亚马逊机器映像 (AMI)
Ubuntu Server 20.04 LTS (HVM),EBS 通用 (SSD) 卷类型。 64 位 (x86)

EC2 实例类型
t2.micro

网络服务器
Nginx

编程语言
PHP

反向代理
Nginx

缓存
我已经在使用 Opcache,正如您在此处看到的那样:http://13.37.46.163/info.php#module_zend+opcache

关于CDN,我已经在使用Grav CDN Plugin。 (https://github.com/getgrav/grav-plugin-cdn)

我的网站日志(请求/分钟)

  1 00:02
  1 00:38
  1 00:54
  1 01:06
  1 01:12
  1 01:23
  1 03:49
  1 04:32
  1 04:57
  6 05:15
  1 05:17
  1 05:31
  1 05:37
  1 06:08
  1 06:32
  1 07:30
  1 07:38
  1 07:55
  1 08:31
  1 10:07
  1 10:35
  1 10:52
  1 10:59
  1 12:53
  1 13:00
  1 14:18
  1 14:28
  1 14:29
  1 14:48
  1 16:05
  1 18:40
  1 19:20
  1 20:24
  1 20:30

即平均每分钟 1 个请求

已执行的测试

  1. 尝试针对 PHP 不托管的静态文件运行 TTFB 测试

我对“main.js”文件进行了 TTFB 测试。

结果如下:

time_namelookup=0.000034
time_connect=0.002659
time_appconnect=0.000000
time_pretransfer=0.002702
time_redirect=0.000000
time_starttransfer=0.003983
time_total=0.004026

结果分析:
结果令人满意(time_starttransfer=0.003983)。但我认为这个结果是由于文件的重量与整个网站相比很轻。 我们可以推断出问题出在 PHP 而不是 Nginx 方面。

  1. 运行 topfree 命令来检查什么正在运行/什么正在使用资源,我不需要什么?

这里是 top 命令的结果

+-----------+--------------+-------------+-------------+------------------+---------+---------+---------+--------+
| %cpu(s):  | 4.0 us,| 0.3 sy,| 0.0 ni,| 95.7 id,| 0.0 wa,| 0.0 hi,| 0.0 si,| 0.0 st |
+-----------+--------------+-------------+-------------+------------------+---------+---------+---------+--------+
| MiB Mem : | 978.6 total,| 75.8 free,| 332.2 used,| 570.6 buff/cache |         |         |         |        |
+-----------+--------------+-------------+-------------+------------------+---------+---------+---------+--------+
| MiB Swap: | 512.0 total,| 427.2 free,| 84.8 used.  | 461.7 avail Mem  |         |         |         |        |
+-----------+--------------+-------------+-------------+------------------+---------+---------+---------+--------+

我在重新加载网站以检查 cpu % 时获取了结果。

这里是 free 命令的结果

+-------+---------+--------+--------+--------+------------+-----------+
|       | total   | used   | free   | shared | buff/cache | available |
+-------+---------+--------+--------+--------+------------+-----------+
| Mem:  | 1002052 | 334392 | 83368  | 16940  | 584292     | 478628    |
+-------+---------+--------+--------+--------+------------+-----------+
| Swap: | 524284  | 86784  | 437500 |        |            |           |
+-------+---------+--------+--------+--------+------------+-----------+

结果分析:
我也许应该使用 t3.micro 而不是 t2.micro - 稍微快一点,便宜一点。(?)

解决方法

首先:一般来说,除非您在尚未打补丁以支持 T3 的操作系统上运行,否则您应该更喜欢 T3 而不是 T2(尤其是在 Linux 上 - 我已经看到一些关于 T2 在 Windows 上的一些次要成本优势的讨论)。在我看来,价格略有下降是为了让您使用 T3 而不是 T2,这样他们最终就可以退休 T2。 T3 使用他们的 Nitro 实例风格,这通常更好(更快),尤其是在网络 IO 中,尽管我不希望您的测试产生影响。 (顺便说一句,如果你真的在寻找便宜的,我有幸购买了价格更低的 T3A 实例)

第二:您正在使用 T 系列实例。来自 AWS:

T3 实例是下一代可突增的通用实例类型,可提供基准水平的 CPU 性能,并能够在需要时随时突增 CPU 使用率。 T3 实例提供了计算、内存和网络资源的平衡,专为 CPU 使用率适中但在使用中遇到临时高峰的应用而设计。

这很好,因为在同一台物理机器上有很多用户。当然,对于许多其他系列也是如此,但在这种情况下,您没有“分配”一个要使用的核心。您和其他许多人都在告诉 AWS,您的工作负载并不是那么高,您希望以偶尔使用 CPU 为代价获得更便宜的实例。这很好,但 AWS 正试图在这里赚钱,并没有为您的 T 实例提供专用 CPU(同样,这是您告诉他们的选择)。作为回报,CPU 可能在您希望的毫秒内不可用,并且实例可能需要等待,直到请求的资源可以在物理实例上使用。根据该实例上有多少其他人以及它的过度配置程度,您的结果可能会有所不同。

据我所知,AWS 没有发布任何关于 T 实例过度配置的信息。如果您怀疑您可能有健谈的邻居,您可以随时通过停止和启动实例来切换到不同的物理机(您不需要终止实例)。这应该会切换您正在运行的物理主机,但不能保证您会获得更好的机器。从本质上讲,您要求同类最便宜的实例系列提供一流的性能。这可能不会达到您的预期。

简而言之,如果您想要最小延迟和保证速度,您将需要切换到不同的实例系列。如果您需要更多保证一致且低延迟的性能,则可能更需要 M5 的“通用”实例类型系列。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...