macでdocker開発時にファイルio?周りで遅くなる問題があるが、バインドマウントをreadonlyにすれば早くなるのか調べる。
なんとなくreadonlyにした方が早くなる気がする
コンテナの/appにLaravleのコードをマウントする。
FROM centos:centos8
RUN dnf module install -y php:7.4
WORKDIR /app
CMD [ "php", "artisan", "serve", "--port=80", "--host=0.0.0.0" ]
まずは普通にroオプション付けずにマウントする。
$ docker run -it --rm -v ~/Documents/test/docker/volume_test/ro_test:/app -p 8080:80 ro_test
負荷テストにはabテストを使用。
10人で10リクエスト = 合計100リクエストで試験。
1秒あたり2.78リクエスト捌ける
全部処理するのに36秒
$ ab -n 100 -c 10 http://localhost:8080/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient).....done
Server Software:
Server Hostname: localhost
Server Port: 8080
Document Path: /
Document Length: 17473 bytes
Concurrency Level: 10
Time taken for tests: 35.945 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 1861900 bytes
HTML transferred: 1747300 bytes
Requests per second: 2.78 [#/sec] (mean)
Time per request: 3594.549 [ms] (mean)
Time per request: 359.455 [ms] (mean, across all concurrent requests)
Transfer rate: 50.58 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 380 3392 655.6 3578 3659
Waiting: 379 3391 655.7 3578 3659
Total: 380 3392 655.6 3578 3659
Percentage of the requests served within a certain time (ms)
50% 3578
66% 3596
75% 3609
80% 3616
90% 3630
95% 3642
98% 3653
99% 3659
100% 3659 (longest request)
readonlyありの方でマウントする
$ docker run -it --rm -v ~/Documents/test/docker/volume_test/ro_test:/app:ro -p 8080:80 ro_test
1秒あたり2.27リクエスト捌ける
全部処理するのに43秒
あれ、readonlyの方が処理が遅くなっている。
ab -n 100 -c 10 http://localhost:8080/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient).....done
Server Software:
Server Hostname: localhost
Server Port: 8080
Document Path: /
Document Length: 519560 bytes
Concurrency Level: 10
Time taken for tests: 43.979 seconds
Complete requests: 100
Failed requests: 0
Non-2xx responses: 100
Total transferred: 51981200 bytes
HTML transferred: 51956000 bytes
Requests per second: 2.27 [#/sec] (mean)
Time per request: 4397.921 [ms] (mean)
Time per request: 439.792 [ms] (mean, across all concurrent requests)
Transfer rate: 1154.25 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 0
Processing: 455 4155 808.2 4374 4487
Waiting: 447 4145 808.2 4362 4478
Total: 455 4155 808.2 4374 4488
Percentage of the requests served within a certain time (ms)
50% 4374
66% 4400
75% 4436
80% 4444
90% 4457
95% 4471
98% 4483
99% 4488
100% 4488 (longest request)
readonlyの時はstorage以下に書き込もうとしてエラーになって余計に時間がかかっている・・・?
試しにstorage以下だけroを外してみる。
マウント時に後から-vを追加することで上書きできるらしい。
$ docker run -it --rm -v $(pwd)/ro_test:/app:ro -v $(pwd)/ro_test/storage:/app/storage -p 8080:80 ro_test
abテストすると、
1秒あたり2.73リクエスト捌ける
全部処理するのに36秒
と、ほぼroなしの状態と同じになった。
ab -n 100 -c 10 http://localhost:8080/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient).....done
Server Software:
Server Hostname: localhost
Server Port: 8080
Document Path: /
Document Length: 17473 bytes
Concurrency Level: 10
Time taken for tests: 36.620 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 1861900 bytes
HTML transferred: 1747300 bytes
Requests per second: 2.73 [#/sec] (mean)
Time per request: 3661.974 [ms] (mean)
Time per request: 366.197 [ms] (mean, across all concurrent requests)
Transfer rate: 49.65 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 370 3461 688.7 3613 4053
Waiting: 369 3461 688.8 3613 4053
Total: 370 3461 688.7 3613 4054
Percentage of the requests served within a certain time (ms)
50% 3613
66% 3629
75% 3640
80% 3644
90% 4031
95% 4044
98% 4050
99% 4054
100% 4054 (longest request)
このことからro付けても早くなるわけではなさそう。