r - nginx 没有为使用 Docker 托管在 AWS 上的 R 管道工 API 提供性能提升
问题描述
我正在尝试使用 Docker 和 AWS 扩展计算成本高昂的 R Plumber API,并且我想处理多个请求,因此我想使用 Nginx 来帮助解决这个问题。
我正在关注本教程:https ://www.knowru.com/blog/how-to-scale-up-credit-model-apis-using-aws/这直接适用于我的用例,但我不是体验建议的性能增益。
我正在实施的步骤总结如下:
1) 我创建了一些数据来测试 API,可以使用以下 R 代码复制这些数据(当我运行以下 docker 命令时,确保我的数据位于正确的位置):
new.data <- list(
Status.of.existing.checking.account='A11'
, Duration.in.month=20
, Credit.history='A32'
, Savings.account.bonds='A65'
)
write_json(new.data, "~/Documents/data.json")
2) 通过命令行使用 Docker,我启动了一个 EC2 实例。我自己的方法和本教程之间的唯一关键区别是:amazonec2-open-port 8000行。
docker-machine create \
--driver amazonec2 \
--amazonec2-access-key xxx \
--amazonec2-secret-key yyy \
--amazonec2-region zzz \
--amazonec2-instance-type t2.small \
--amazonec2-open-port 8000 \
nginx-testing-machine
3)我从knowru github repo构建Docker镜像,然后运行。
eval "$(docker-machine env nginx-testing-server)" && docker build -t
knowru/plumber_example https://github.com/Knowru/plumber_example.git
eval "$(docker-machine env nginx-testing-server)" && docker run -p
8000:8000 -d knowru/plumber_example
4) 使用docker-machine ip nginx-testing-server找出我的 EC2 的 IP 后,我使用 siege 测试 API。
siege -H 'Content-Type:application/json'
"http://IP_ADDRESS:8000/predict POST < data.json" -b -c 10 -r 100
这为我提供了以下结果:
Transactions: 1000 hits
Availability: 100.00 %
Elapsed time: 13.32 secs
Data transferred: 0.03 MB
Response time: 0.13 secs
Transaction rate: 75.08 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 9.74
Successful transactions: 1000
Failed transactions: 0
Longest transaction: 1.15
Shortest transaction: 0.06
5) 我现在添加四个其他 Docker 容器,每个容器映射到端口 8000。
eval "$(docker-machine env nginx-testing-server)" && docker run -p
8001:8000 -d knowru/plumber_example
eval "$(docker-machine env nginx-testing-server)" && docker run -p
8002:8000 -d knowru/plumber_example
eval "$(docker-machine env nginx-testing-server)" && docker run -p
8003:8000 -d knowru/plumber_example
eval "$(docker-machine env nginx-testing-server)" && docker run -p
8004:8000 -d knowru/plumber_example
6)我有点不确定为什么,但是本教程在 EC2 上克隆了 git repo,这是在这里完成的:
eval "$(docker-machine env nginx-testing-server)" && git clone
https://github.com/Knowru/plumber_example.git
然后我运行 nginx 映像(注意 80:8000 的端口映射,这是我不确定的):
eval "$(docker-machine env nginx-testing-server)" && docker run -v
/home/ubuntu/plumber_example:/etc/nginx/conf.d:ro -d -p 80:8000 nginx
7)我再次围攻运行相同的测试
siege -H 'Content-Type:application/json'
"http://IP_ADDRESS:8000/predict POST < data.json" -b -c 10 -r 100
这为我提供了非常相似的外观结果
Transactions: 1000 hits
Availability: 100.00 %
Elapsed time: 14.04 secs
Data transferred: 0.03 MB
Response time: 0.14 secs
Transaction rate: 71.23 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 9.71
Successful transactions: 1000
Failed transactions: 0
Longest transaction: 1.21
Shortest transaction: 0.07
结果非常相似,所以我做错了。我唯一改变的是端口,所以它向我暗示端口映射是错误的。如果是这种情况,我该如何正确执行此操作以及使用 nginx 的限制/要求是什么?提前感谢您对此提供的任何帮助 - 我认为对于有此技术经验的人来说这很简单。
解决方案
推荐阅读
- asp.net - 生成的表单 asp-action 标签助手包括 id
- reactjs - 样式化组件和 react-bootstrap
- solr - 无法创建新核心,原因是:_version_ 字段必须存在于架构中且可搜索
- django - 如何在 Django URL 路径中使用 next_page
- visual-studio - 将整个项目添加到源代码管理
- java - 如何防止开发者使用有风险的方法
- javascript - 如何在 Swing-GUI 和 WebApplication(如 Vaadin 或本机 JS)之间同步倒计时
- python - 在不拆分数据的情况下创建 RandomForest 训练。我在一个文件中有训练数据,在另一个文件中有测试数据
- mysql - 映射多对多关系表,如果映射表中不存在数据则显示0
- python - 将字典中的键打印为不带引号的元组