非AWS服务器连接到AWS RDS数据库的速度要慢得多

时间:2019-05-08 11:33:56

标签: php amazon-web-services amazon-ec2 mariadb amazon-rds

我正在从一家托管公司迁移,该公司当前将基于PHP的Web应用程序和MySQL数据库托管在同一服务器上。他们的服务器规格不错,服务器运行在SSD,11GB RAM和8核CPU(GenuineIntel,QEMU虚拟CPU版本(cpu64-rhel6),2399.996 MHz,4096 KB缓存)上。

我无法一次移动所有内容,因此只想将数据库移动到AWS RDS并将PHP配置中的主机更新到AWS终端节点。

我已经使用可用于测试的AWS上的基本软件包进行了设置-t2.micro EC2(用于测试/基准测试PHP脚本)和db.t2.micro RDS。

一切正常,但从远程非AWS服务器连接时,非常很慢。运行相同版本的MariaDB,表中行数相同的相同数据库表将产生以下结果:

AWS EC2 -> AWS RDS (fully AWS)
Connected via PDO in 0.04 seconds
Queried 1000 rows in 0.63 seconds

Remote Server -> AWS RDS (part AWS)
Connected via PDO in 0.16 seconds
Queried 1000 rows in 5.49 seconds

Remote Server -> Database running on same server (non AWS)
Connected via PDO in 0.00 seconds
Queried 1000 rows in 2.70 seconds

如您所见,即使在免费套餐上,完整的AWS设置也是迄今为止最快的。

完全远程服务器的设置速度较慢,但​​仍然不尽人意。

远程服务器-> AWS设置最慢。

由于我是AWS的新手,如果有人可以告知我是否期望这样做,我将非常感激。非AWS调用AWS RDS的速度总是会这么慢吗?

任一台服务器上的某些东西会限制速度吗?

PS。远程服务器位于英国,并且AWS区域设置为EU-West,所以我认为它与距离延迟无关。

编辑 里克·詹姆斯(Rick James)在下面的评论中询问了有关查询缓存等的内容。缓存已禁用,但是请确保我更改了脚本,以便执行以下操作:

$mysqli = mysqli_connect($dbhost,$username,$password,$dbname) or die ("could not connect to mysql");

$tableCreate = "CREATE TABLE IF NOT EXISTS test_tbl (id int(11) NOT NULL auto_increment, RandomTxt TEXT, PRIMARY KEY (id))";
$queryResult = mysqli_query($mysqli , $tableCreate);

for ($i = 1; $i <= 1000; $i++) {
    mysqli_query($mysqli,"INSERT INTO `test_tbl` (RandomTxt) VALUES ('abcdefghijklmnopqrstuvwxyz')" )  ;
}

$result = mysqli_query($mysqli , 'SELECT * FROM test_tbl') ;
$arrayResults = array() ;
while ($row = $result->fetch_assoc()) {
    array_push($arrayResults , $row['RandomTxt']);
}

$dropTable = "DROP TABLE `test_tbl`";
$queryResult = mysqli_query($mysqli , $dropTable);

每次查询后,我都有一个PHP计时器脚本。更新后的脚本的结果是:

AWS EC2 -> AWS RDS (fully AWS)
Db connection established at : 0.04184008
Table created at : 0.05363607
Data inserted into the table at : 3.64998102
Data is read from table and inserted into an array at : 3.65190291
Table dropped at : 3.66061902

Remote Server -> AWS RDS (part AWS)
Db connection established at : 0.08496714
Table created at : 0.11568093
Data inserted into the table at : 21.78033495
Data is read from table and inserted into an array at : 21.82050204
Table dropped at : 21.84762096

Remote Server -> Database running on same server (non AWS)
Db connection established at : 0.00079298
Table created at : 0.00664401
Data inserted into the table at : 0.15589213
Data is read from table and inserted into an array at : 0.16134501
Table dropped at : 0.16468596

我只想重申一下,我是使用AWS的新手,如果这些结果符合人们的期望,请告诉我。我需要知道从非AWS服务器连接到RDS是否应该足够快以进行生产使用,因为目前肯定不是。

编辑2 我还运行了time nc -vz xxx.xxx.eu-west-1.rds.amazonaws.com 3306来检查时间。非AWS主机的结果是:

real    0m0.227s
user    0m0.014s
sys     0m0.005s

从EC2到RDS的结果是:

real    0m0.112s
user    0m0.002s
sys     0m0.000s

2 个答案:

答案 0 :(得分:0)

对于“远程”测试,我很惊讶只有5.49秒穿过池塘。您在美国和英国之间有1002次往返。这意味着每个ping时间为5.5毫秒;我认为不仅限于此。如果将所有1000个插入内容放入单个语句,则所有“插入”时间都会大大改善。这种变化甚至可以帮助本地代码,但效果不那么明显(只有10倍而不是近1000倍)。

据我了解各种配置的描述,ping时间(最长5.5ms)是速度的最大因素。

第二大数字是提交交易。 “本地” 150ms一次提交1000行,这意味着非常快的0.15ms。那一定是SSD。

我希望在每个步骤的前后都使用microtime(true)进行计时,然后打印差异。闻起来好像您提供的电话号码有多余的开销。

另一件事要验证: all 测试中的表ENGINE = InnoDB(不是MyISAM)吗?最好在CREATE TABLE上明确。

因此...批量INSERTs并进行其他操作以减少往返次数。还有其他技巧,但是我们需要查看 real 代码,而不是人工基准。另一个技巧是将多个语句组合到一个存储过程中。那么只有一次往返CALL的过程,而不是多次。

答案 1 :(得分:0)

在我的主机经过长时间调试后,他们得出结论,除非AWS在其附近的数据中心中添加自己的硬件,否则无法通过其数据中心的任何服务来解决此问题。

可以选择将应用程序移动到伦敦数据中心的一台服务器中,从而减少对AWS的延迟。

因此,基本上这是不正常的,可以在非AWS托管的应用程序中使用RDS,但非AWS主机所在的位置确实很重要。