如何解决需要指导以增加我们项目的请求流量
我们的项目遇到了数据库问题。
我们希望每秒支持至少 20 个请求,但是如果我们达到这个数字(使用压力测试设置),即使实际请求的代码被禁用,我们的数据库或设置中的其他内容也无法应对这种负载(这意味着 API 只检查用户是否是有效用户,而不是完成应该做的整个工作)。此时用户表不到100行10列。
堆栈是用 docker 构建的。我们使用 MySQL 8.0.14
。该项目是在 yii2
上编写的,我们在每次查询时都使用 ActiveRecord
访问数据库。
一个请求的工作流程如下。当用户发出 API 请求时,会同时发送一个 JWT 令牌。然后 API 向 MongoDB 请求此令牌以验证它是我们的。如果是这种情况,那么使用来自 mongo 的 userId,我们会从 MySQL 中询问此用户的数据,该用户所需的所有信息都存储在何处。之后,我们执行请求的代码。
我们关注的压力测试查询是当我们模拟 500 个用户每 10 秒发出 1 个请求并运行 3 分钟时。在这个测试中,我们禁用了请求的代码,我们只让代码检查用户的有效性。结果如下:
我们用来模拟交通的程序here
正在运行:./hey -c 500 -q 0.1 -z 3m
Summary:
Total: 191.2756 secs
Slowest: 19.9512 secs
Fastest: 0.2022 secs
Average: 9.1227 secs
Requests/sec: 40.1306
Response time histogram:
0.202 [1] |
2.177 [639] |■■■■■■■■■■■■■
4.152 [320] |■■■■■■
6.127 [750] |■■■■■■■■■■■■■■■
8.102 [1355] |■■■■■■■■■■■■■■■■■■■■■■■■■■■
10.077 [881] |■■■■■■■■■■■■■■■■■■
12.052 [671] |■■■■■■■■■■■■■
14.026 [2012] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
16.001 [527] |■■■■■■■■■■
17.976 [25] |
19.951 [12] |
Status code distribution:
[200] 6550 responses
[500] 34 responses
[502] 609 responses
可以找到更多测试here
仅验证用户时请求访问的表
CREATE TABLE `user_profile` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`company_id` int(10) unsigned NOT NULL,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`system_status` tinyint(3) unsigned NOT NULL,`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,`telephone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,`last_login_datetime` datetime DEFAULT NULL,`creation_datetime` datetime NOT NULL,`modification_datetime` datetime NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `user_profile@email_uniqueIdx` (`email`),UNIQUE KEY `user_profile@telephone_uniqueIdx` (`telephone`),KEY `user_profile@company_id_idx` (`company_id`),CONSTRAINT `fk_user_profile_w_company` FOREIGN KEY (`company_id`) REFERENCES `company` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_c
CREATE TABLE `user_profile_role` (
`user_profile_id` int(10) unsigned NOT NULL,`role` tinyint(3) unsigned NOT NULL,PRIMARY KEY (`user_profile_id`,`role`),CONSTRAINT `fk_user_profile_role_w_user_profile` FOREIGN KEY (`user_profile_id`) REFERENCES `user_profile` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
CREATE TABLE `company` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`website` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,UNIQUE KEY `company@name_uniqueIdx` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
mongo db
* This is the model class for table "UserProfileJsonWebToken".
*
* @property ObjectId $_id
* @property int $userProfileId
* @property string $value
* @property int $acquireCount
* @property int $systemStatus
* @property string $lastUseDatetime
* @property string $creationDatetime
* @property string $modificationDatetime
*/
当 DB 未加载时,启用代码的请求需要 361 毫秒
发布请求的 Yii 调试日志 here
1.更新 禁用调试模式并添加缓存后
main-db.php
'enableSchemaCache' => true,'schemaCacheDuration' => 86400,'schemaCache' => 'cache',
main.php
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',],
我得到了这个结果
Summary:
Total: 187.0877 secs
Slowest: 7.3969 secs
Fastest: 0.1197 secs
Average: 3.5332 secs
Requests/sec: 48.1058
Total data: 1239578 bytes
Size/request: 143 bytes
Response time histogram:
0.120 [1] |
0.847 [187] |■■■■■
1.575 [1633] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
2.303 [1078] |■■■■■■■■■■■■■■■■■■■■■■■■■■
3.031 [1102] |■■■■■■■■■■■■■■■■■■■■■■■■■■■
3.758 [811] |■■■■■■■■■■■■■■■■■■■■
4.486 [628] |■■■■■■■■■■■■■■■
5.214 [1172] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
5.941 [905] |■■■■■■■■■■■■■■■■■■■■■■
6.669 [687] |■■■■■■■■■■■■■■■■■
7.397 [455] |■■■■■■■■■■■
Latency distribution:
10% in 1.1331 secs
25% in 1.8714 secs
50% in 3.3492 secs
75% in 5.1533 secs
90% in 6.2478 secs
95% in 6.7027 secs
99% in 7.2395 secs
Details (average,fastest,slowest):
DNS+dialup: 0.0100 secs,0.1197 secs,7.3969 secs
DNS-lookup: 0.0000 secs,0.0000 secs,0.0000 secs
req write: 0.0001 secs,0.0115 secs
resp wait: 3.5052 secs,0.1163 secs,7.3231 secs
resp read: 0.0001 secs,0.0024 secs
Status code distribution:
[200] 7446 responses
[502] 1213 responses
Error distribution:
[341]Post "http://127.0.0.1/api/v1/vehicle-locations": EOF
我有很大的进步,但需要做更多的工作
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。