nginx无法为使用Docker托管在AWS上的R plumber API提供性能提升

时间:2018-10-07 17:19:53

标签: r amazon-web-services docker nginx amazon-ec2

我正在尝试使用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存储库构建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后,我使用围攻来测试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有哪些限制/要求?在此先感谢您的帮助-我认为对于有这项技术的人来说这很简单。

0 个答案:

没有答案