diff --git a/doc/source/index.rst b/doc/source/index.rst index 37c1b14..f739467 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -21,6 +21,7 @@ Contents introduction.rst methodologies/index.rst test_plans/index.rst + test_results/index.rst labs/index.rst test_results/index diff --git a/doc/source/test_results/container_repositories/artifactory/Network_Scheme.png b/doc/source/test_results/container_repositories/artifactory/Network_Scheme.png new file mode 100644 index 0000000..d1f295a Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/Network_Scheme.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/configs/artifactory_etc.tar.gz b/doc/source/test_results/container_repositories/artifactory/configs/artifactory_etc.tar.gz new file mode 100644 index 0000000..11511cb Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/configs/artifactory_etc.tar.gz differ diff --git a/doc/source/test_results/container_repositories/artifactory/configs/config_descriptor.xml b/doc/source/test_results/container_repositories/artifactory/configs/config_descriptor.xml new file mode 100644 index 0000000..c6beea6 --- /dev/null +++ b/doc/source/test_results/container_repositories/artifactory/configs/config_descriptor.xml @@ -0,0 +1,587 @@ + + + false + true + 100 + dd-MM-yy HH:mm:ss z + + true + 1457516661046 + + + true + false + false + + supported + + false + 60 + true + + + + + + false + 5 + + + + + backup-daily + true + 0 0 2 ? * MON-FRI + 0 + false + + true + false + false + + + backup-weekly + false + 0 0 2 ? * SAT + 336 + false + + true + false + false + + + + false + 0 23 5 * * ? + + + + docker-local + docker + **/* + simple-default + V2 + false + false + false + true + true + 0 + true + + artifactory + + true + unique + client-checksums + false + 0 + false + + + + + + + + nginx + nginx + artifactory + artifactory + 172.20.9.16 + + + + portPerRepo + false + true + 443 + 80 + + + docker-local + 172.20.9.16 + 5000 + + + 172.20.9.16 + artifactory + 8081 + + + + + artifactory + false + + + licenses + true + true + + + AFL-3.0 + false + + + AGPL-V3 + false + + + APL-1.0 + false + + + Apache-2.0 + false + + + Apache-1.0 + false + + + Apache-1.1 + false + + + APSL-2.0 + false + + + Artistic-License-2.0 + false + + + Attribution + false + + + BSL-1.0 + false + + + CA-TOSL-1.1 + false + + + CDDL-1.0 + false + + + CDDL-1.0.1 + false + + + CDDL-1.1 + false + + + Codehaus + false + + + CCAG-2.5 + false + + + CPAL-1.0 + false + + + CUAOFFICE-1.0 + false + + + Day + false + + + Day-Addendum + false + + + Bouncy-Castle + false + + + EUDATAGRID + false + + + Enovi + false + + + CPL-1.0 + false + + + LGPL-2.1 + false + + + LGPL-3.0 + false + + + Historical + false + + + HSQLDB + false + + + IBMPL-1.0 + false + + + IPAFont-1.0 + false + + + ISC + false + + + Lucent-1.02 + false + + + MirOS + false + + + MS-PL + false + + + MS-RL + false + + + JA-SIG + false + + + BSD + false + + + MIT + false + + + JSON + false + + + Motosoto-0.9.1 + false + + + Eclipse-1.0 + false + + + ECL2 + false + + + Eiffel-2.0 + false + + + JTidy + false + + + JTA-Specification-1.0.1B + false + + + Entessa-1.0 + false + + + EUPL-1.1 + false + + + Fair + false + + + Frameworx-1.0 + false + + + GPL-2.0 + false + + + GPL-2.0+CE + false + + + GPL-3.0 + false + + + Mozilla-1.1 + false + + + Multics + false + + + NASA-1.3 + false + + + NTP + false + + + NAUMEN + false + + + Nethack + false + + + Nokia-1.0a + false + + + NOSL-3.0 + false + + + OCLC-2.0 + false + + + Openfont-1.1 + false + + + Opengroup + false + + + OpenSymphony + false + + + OSL-3.0 + false + + + PHP-3.0 + false + + + PostgreSQL + false + + + Public Domain + false + + + Public Domain - SUN + false + + + PythonPL + false + + + PythonSoftFoundation + false + + + QTPL-1.0 + false + + + Real-1.0 + false + + + RPL-1.5 + false + + + RicohPL + false + + + SimPL-2.0 + false + + + Sleepycat + false + + + SUNPublic-1.0 + false + + + Sybase-1.0 + false + + + TMate + false + + + UoI-NCSA + false + + + IU-Extreme-1.1.1 + false + + + VovidaPL-1.0 + false + + + W3C + false + + + wxWindows + false + + + Xnet + false + + + ZPL-2.0 + false + + + ZLIB + false + + + TPL + false + + + Not Searched + false + + + + + + + + + maven-2-default + [orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext] + true + [orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom + SNAPSHOT + SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+)) + + + ivy-default + [org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext] + true + [org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml + \d{14} + \d{14} + + + gradle-default + [org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext] + true + [org]/[module]/ivy-[baseRev](-[fileItegRev]).xml + \d{14} + \d{14} + + + maven-1-default + [org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext] + true + [org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom + .+ + .+ + + + nuget-default + [orgPath]/[module]/[module].[baseRev](-[fileItegRev]).nupkg + false + .* + .* + + + npm-default + [orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).tgz + false + .* + .* + + + bower-default + [orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).[ext] + false + .* + .* + + + vcs-default + [orgPath]/[module]/[refs<tags|branches>]/[baseRev]/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext] + false + .* + [a-zA-Z0-9]{40} + + + sbt-default + [org]/[module]/(scala_[scalaVersion<.+>])/(sbt_[sbtVersion<.+>])/[baseRev]/[type]s/[module](-[classifier]).[ext] + true + [org]/[module]/(scala_[scalaVersion<.+>])/(sbt_[sbtVersion<.+>])/[baseRev]/[type]s/ivy.xml + \d{14} + \d{14} + + + simple-default + [orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).[ext] + false + .* + .* + + + + + + 0 0 /4 * * ? + + + 0 12 5 * * ? + + + 0 12 0 * * ? + + + false + 1024 + 5000 + 10 + + + true + false + 14 + + diff --git a/doc/source/test_results/container_repositories/artifactory/configs/nginx.conf b/doc/source/test_results/container_repositories/artifactory/configs/nginx.conf new file mode 100644 index 0000000..6e65205 --- /dev/null +++ b/doc/source/test_results/container_repositories/artifactory/configs/nginx.conf @@ -0,0 +1,85 @@ +user www-data; +worker_processes 30; +pid /run/nginx.pid; + +events { + worker_connections 768; + # multi_accept on; +} + +http { + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + include /etc/nginx/mime.types; + default_type application/octet-stream; + + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log; + + gzip on; + gzip_disable "msie6"; + + include /etc/nginx/conf.d/*.conf; + include /etc/nginx/sites-enabled/*; + +## server configuration +server { + + listen 80 ; + + server_name 172.20.9.16; + if ($http_x_forwarded_proto = '') { + set $http_x_forwarded_proto $scheme; + } + ## Application specific logs + ## access_log /var/log/nginx/172.20.9.16-access.log timing; + ## error_log /var/log/nginx/172.20.9.16-error.log; + rewrite ^/$ /artifactory/webapp/ redirect; + rewrite ^/artifactory/?(/webapp)?$ /artifactory/webapp/ redirect; + location /artifactory/ { + proxy_read_timeout 900; + proxy_pass_header Server; + proxy_cookie_path ~*^/.* /; + proxy_pass http://172.20.9.16:8081/artifactory/; + proxy_set_header X-Artifactory-Override-Base-Url $http_x_forwarded_proto://$host:$server_port/artifactory; + proxy_set_header X-Forwarded-Port $server_port; + proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} + +## server configuration +server { + listen 5000; + + + server_name 172.20.9.16; + if ($http_x_forwarded_proto = '') { + set $http_x_forwarded_proto $scheme; + } + ## Application specific logs + ## access_log /var/log/nginx/172.20.9.16-access.log timing; + ## error_log /var/log/nginx/172.20.9.16-error.log; + rewrite ^/(v1|v2)/(.*) /artifactory/api/docker/docker-local/$1/$2; + client_max_body_size 0; + chunked_transfer_encoding on; + location /artifactory/ { + proxy_read_timeout 900; + proxy_pass_header Server; + proxy_cookie_path ~*^/.* /; + proxy_pass http://172.20.9.16:8081/artifactory/; + proxy_set_header X-Artifactory-Override-Base-Url $http_x_forwarded_proto://$host:$server_port/artifactory; + proxy_set_header X-Forwarded-Port $server_port; + proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} + + +} diff --git a/doc/source/test_results/container_repositories/artifactory/configs/security_descriptor.xml b/doc/source/test_results/container_repositories/artifactory/configs/security_descriptor.xml new file mode 100644 index 0000000..68bf2ff --- /dev/null +++ b/doc/source/test_results/container_repositories/artifactory/configs/security_descriptor.xml @@ -0,0 +1,107 @@ + + + + + anonymous + d41d8cd98f00b204e9800998ecf8427e + false + true + false + true + false + true + true + false + + + + passwordCreated + 1457516661467 + + + 0 + 0 + false + + + admin + 1f70548d73baca61aab8660733c7de81 + CAFEBABEEBABEFAC + true + true + true + true + false + true + true + internal + false + + + + passwordCreated + 1457516661448 + + + 1458541070096 + 172.20.8.3 + 0 + false + + + + + readers + A group for read-only users + true + artifactory + + + + + + Any Remote + + ANY REMOTE + + + ** + + + + + + anonymous + false + 3 + + + _system_ + + + + Anything + + ANY + + + ** + + + + + + readers + true + 1 + + + anonymous + false + 31 + + + _system_ + + + diff --git a/doc/source/test_results/container_repositories/artifactory/configs/server_description_of_728997-comp-disk-228.tar.gz b/doc/source/test_results/container_repositories/artifactory/configs/server_description_of_728997-comp-disk-228.tar.gz new file mode 100644 index 0000000..4b5db86 Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/configs/server_description_of_728997-comp-disk-228.tar.gz differ diff --git a/doc/source/test_results/container_repositories/artifactory/configs/server_description_of_728998-comp-disk-227.tar.gz b/doc/source/test_results/container_repositories/artifactory/configs/server_description_of_728998-comp-disk-227.tar.gz new file mode 100644 index 0000000..22752df Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/configs/server_description_of_728998-comp-disk-227.tar.gz differ diff --git a/doc/source/test_results/container_repositories/artifactory/index.rst b/doc/source/test_results/container_repositories/artifactory/index.rst new file mode 100644 index 0000000..73e2c4d --- /dev/null +++ b/doc/source/test_results/container_repositories/artifactory/index.rst @@ -0,0 +1,347 @@ + +.. _Measuring_performance_of_JFrog_Artifactory_Pro: + +********************************************************* +Results of measuring performance of JFrog Artifactory Pro +********************************************************* + +:Abstract: + + This document includes performance test results of `JFrog Artifactory Pro`_ + service as a repository of docker images. All test have been performed + regarding :ref:`Measuring_performance_of_container_repositories` + + +Environment description +======================= +Hardware configuration of each server +------------------------------------- + +.. table:: Description of servers hardware + + +-------+----------------+------------------------+------------------------+ + |server |name |728998-comp-disk-228 |728998-comp-disk-227 | + | +----------------+------------------------+------------------------+ + | |role |test_tool |artifactory | + | +----------------+------------------------+------------------------+ + | |vendor,model |HP,DL380 Gen9 |HP,DL380 Gen9 | + | +----------------+------------------------+------------------------+ + | |operating_system| | 3.13.0-76-generic | | 3.13.0-76-generic | + | | | | Ubuntu-trusty | | Ubuntu-trusty | + | | | | x86_64 | | x86_64 | + +-------+----------------+------------------------+------------------------+ + |CPU |vendor,model |Intel,E5-2680 v3 |Intel,E5-2680 v3 | + | +----------------+------------------------+------------------------+ + | |processor_count |2 |2 | + | +----------------+------------------------+------------------------+ + | |core_count |12 |12 | + | +----------------+------------------------+------------------------+ + | |frequency_MHz |2500 |2500 | + +-------+----------------+------------------------+------------------------+ + |RAM |vendor,model |HP,752369-081 |HP,752369-081 | + | +----------------+------------------------+------------------------+ + | |amount_MB |262144 |262144 | + +-------+----------------+------------------------+------------------------+ + |NETWORK|interface_name |p1p1 |p1p1 | + | +----------------+------------------------+------------------------+ + | |vendor,model |Intel,X710 Dual Port |Intel,X710 Dual Port | + | +----------------+------------------------+------------------------+ + | |bandwidth |10G |10G | + +-------+----------------+------------------------+------------------------+ + |STORAGE|dev_name |/dev/sda |/dev/sda | + | +----------------+------------------------+------------------------+ + | |vendor,model | | raid10 - HP P840 | | raid10 - HP P840 | + | | | | 12 disks EH0600JEDHE | | 12 disks EH0600JEDHE | + | +----------------+------------------------+------------------------+ + | |SSD/HDD |HDD |HDD | + | +----------------+------------------------+------------------------+ + | |size | 3,6TB | 3,6TB | + +-------+----------------+------------------------+------------------------+ + +Network scheme and part of configuration of hardware network switches +--------------------------------------------------------------------- +Network scheme of the environment: + +.. image:: Network_Scheme.png + :alt: Network Scheme of the environment + +Here is the part of switch configuration for each switch port which connected to +p1p1 interface of a server: + +.. code:: bash + + switchport mode trunk + switchport trunk native vlan 600 + switchport trunk allowed vlan 600-602,630-649 + spanning-tree port type edge trunk + spanning-tree bpduguard enable + no snmp trap link-status + +Software configuration of the Artifactory service +------------------------------------------------- +Installation of Artifactory: +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. code:: bash + + # Install Java + apt-get install software-properties-common + sudo add-apt-repository ppa:webupd8team/java + apt-get update + sudo apt-get install oracle-java8-installer # Interactive java installer + # Install ArtifactoryPro + echo "deb https://jfrog.bintray.com/artifactory-pro-debs trusty main" > /etc/apt/sources.list.d/artifactory.list + apt-get update + apt-get install jfrog-artifactory-pro + # Install Nginx as a reverse proxy + # https://www.jfrog.com/confluence/display/RTF/Configuring+NGINX + apt-get install nginx + +You can find nginx configuration file here +:download:`nginx.conf ` + +Here is the all config files of Artifactory +:download:`artifactory_etc.tar.gz ` + +After installation all default repositories was removed from Artifactory and +"docker-local" hosted repository was created. You can find full configuration of +the Artifactory installation here: +:download:`config_descriptor.xml ` +:download:`security_descriptor.xml ` + +.. table:: Versions of some software + + +-----------+------------------+ + |Software |Version | + +===========+==================+ + |Ubuntu |Ubuntu 14.04.3 LTS| + +-----------+------------------+ + |Artifactory|4.5.2 rev 40121 | + +-----------+------------------+ + +Operating system configuration: +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You can find outputs of some commands and /etc folder in the following archive: +:download:`server_description_of_728998-comp-disk-227.tar.gz ` + +Software configuration of the node with test tool +------------------------------------------------- +Test tool: +^^^^^^^^^^ +Firstly we need to install docker-engine: + +.. code:: bash + + echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" > /etc/apt/sources.list.d/docker.list + apt-get update && apt-get -y install docker-engine + echo DOCKER_OPTS=\"--insecure-registry 172.20.9.16:5000\" >> /etc/default/docker + service docker restart + +We use Python2.7 and +:ref:`Script for collecting performance metrics of docker repository` with +:ref:`Proposed docker file` to perform the tests. The image size is a sum of +layers: + +.. code:: bash + + IMAGE CREATED CREATED BY SIZE COMMENT + 93333b8ed564 About a minute ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/usr/s 0 B + 35d8142196c0 About a minute ago /bin/sh -c #(nop) EXPOSE 80/tcp 0 B + 3a63f30ab247 About a minute ago /bin/sh -c apt-get install -y nginx 18.14 MB + 97434d46f197 2 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B + 2 days ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kB + 2 days ago /bin/sh -c set -xe && echo '#!/bin/sh' > /u 194.5 kB + 2 days ago /bin/sh -c #(nop) ADD file:e01d51d39ea04c8efb 187.8 MB + +It means that DATA_SIZE=206.13 MB + +.. table:: Versions of some software + + +-----------+------------------+ + |Software |Version | + +===========+==================+ + |Ubuntu |Ubuntu 14.04.3 LTS| + +-----------+------------------+ + |Docker |1.10 | + +-----------+------------------+ + +Operating system: +^^^^^^^^^^^^^^^^^ +You can find outputs of some commands and /etc folder in the following archive: +:download:`server_description_of_728997-comp-disk-228.tar.gz ` + +Testing process +=============== +1. + Artifactory was installed on top of 728998-comp-disk-227 server as described in + `Installation of Artifactory:`_ section. + +2. + The values of the variables in test-repo.py script was changed: + iterations = 1000 + concurrency = 1 + repo_address = "172.20.9.16:5000" + +3. + The following command was executed to perform the tests: + + .. code:: bash + + sudo python test-repo.py + +4. + push_results.csv and pull_results.csv was saved in persistent folder. + +5. Clean up docker repository in Artifactory via Web UI + +6. + The steps from 2 to 5 was repeated with the following values of the + concurrency parameters: 1,10,30,50,100 + +Results +======= +Push action results +------------------- +PUSH_TIME(ITERATION) +^^^^^^^^^^^^^^^^^^^^ +After simple processing results the following plots for push action in depend on +iteration number created (click to expand an image): + ++----------------+-------------------------------------------------------------+ +|Function |Plot | ++================+=============================================================+ +|PUSH_TIME |.. image:: results/artifactory-1000-1/push-1000-1.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=1) | +|CONCURRENCY=1) | :scale: 20 | ++----------------+-------------------------------------------------------------+ +|PUSH_TIME |.. image:: results/artifactory-1000-10/push-1000-10.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=10) | +|CONCURRENCY=10) | :scale: 20 | ++----------------+-------------------------------------------------------------+ +|PUSH_TIME |.. image:: results/artifactory-1000-30/push-1000-30.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=30) | +|CONCURRENCY=30) | :scale: 20 | ++----------------+-------------------------------------------------------------+ +|PUSH_TIME |.. image:: results/artifactory-1000-50/push-1000-50.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=50) | +|CONCURRENCY=50) | :scale: 20 | ++----------------+-------------------------------------------------------------+ +|PUSH_TIME |.. image:: results/artifactory-1000-100/push-1000-100.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=100) | +|CONCURRENCY=100)| :scale: 20 | ++----------------+-------------------------------------------------------------+ +|PUSH_TIME |.. image:: results/artifactory-push-1000-1_10_30_50_100.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY={1,10,30,50,100} | +|CONCURRENCY={1, | :scale: 20 | +|10,30,50,100} | | ++----------------+-------------------------------------------------------------+ + +PUSH_TIME(CONCURRENCY) +^^^^^^^^^^^^^^^^^^^^^^ +The following table and graph show how PUSH_TIME parameter depend on CONCURRENCY +parameter. + +.. table:: Maximum, Minimum, Average and Percentile 90% of PUSH_TIME values in + depend on CONCURRENCY parameter. + + +-----------+-----------+-----------+-----------+--------------+ + |Concurrency|Maximum |Minimum |Average |Percentile 90%| + +===========+===========+===========+===========+==============+ + +-----------+-----------+-----------+-----------+--------------+ + |1 |20.45173717|18.13562512|18.45595757|18.70360937 | + +-----------+-----------+-----------+-----------+--------------+ + |10 |52.81749606|21.4737699 |47.39192888|47.92230422 | + +-----------+-----------+-----------+-----------+--------------+ + |30 |147.2520959|21.35128784|140.8133277|143.3592351 | + +-----------+-----------+-----------+-----------+--------------+ + |50 |242.0436599|21.53936005|232.1077632|238.6817375 | + +-----------+-----------+-----------+-----------+--------------+ + |100 |474.1983588|21.41779709|447.7350837|471.5060248 | + +-----------+-----------+-----------+-----------+--------------+ + +.. image:: results/artifactory-push.png + :alt: PUSH_TIME + :scale: 100 + +Pull action results +------------------- +PULL_TIME(ITERATION) +^^^^^^^^^^^^^^^^^^^^ +After simple processing results the following plots for pull action in depend on +iteration number created (click to expand an image): + ++----------------+-------------------------------------------------------------+ +|Function |Plot | ++================+=============================================================+ +|PULL_TIME |.. image:: results/artifactory-1000-1/pull-1000-1.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=1) | +|CONCURRENCY=1) | :scale: 20 | ++----------------+-------------------------------------------------------------+ +|PULL_TIME |.. image:: results/artifactory-1000-10/pull-1000-10.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=10) | +|CONCURRENCY=10) | :scale: 20 | ++----------------+-------------------------------------------------------------+ +|PULL_TIME |.. image:: results/artifactory-1000-30/pull-1000-30.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=30) | +|CONCURRENCY=30) | :scale: 20 | ++----------------+-------------------------------------------------------------+ +|PULL_TIME |.. image:: results/artifactory-1000-50/pull-1000-50.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=50) | +|CONCURRENCY=50) | :scale: 20 | ++----------------+-------------------------------------------------------------+ +|PULL_TIME |.. image:: results/artifactory-1000-100/pull-1000-100.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=100) | +|CONCURRENCY=100)| :scale: 20 | ++----------------+-------------------------------------------------------------+ +|PULL_TIME |.. image:: results/artifactory-pull-1000-1_10_30_50_100.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY={1,10,30,50,100} | +|CONCURRENCY={1, | :scale: 20 | +|10,30,50,100} | | ++----------------+-------------------------------------------------------------+ + +PULL_TIME(CONCURRENCY) +^^^^^^^^^^^^^^^^^^^^^^ +The following table and graph show how PUSH_TIME parameter depend on CONCURRENCY +parameter. + +.. table:: Maximum, Minimum, Average and Percentile 90% of PULL_TIME values in + depend on CONCURRENCY parameter. + + +-----------+------------+-------------+------------+--------------+ + |Concurrency|Maximum |Minimum |Average |Percentile 90%| + +===========+============+=============+============+==============+ + |1 |1.023168087 |0.09103393555|0.7067174957|0.7760614157 | + +-----------+------------+-------------+------------+--------------+ + |10 |1.87360692 |0.08845591545|1.127708118 |1.361271906 | + +-----------+------------+-------------+------------+--------------+ + |30 |4.27976203 |0.1920921803 |2.644113734 |2.870757174 | + +-----------+------------+-------------+------------+--------------+ + |50 |6.287320852 |0.2292528152 |4.416184656 |4.711911416 | + +-----------+------------+-------------+------------+--------------+ + |100 |10.30138803 |0.167137146 |8.50843117 |9.09850688 | + +-----------+------------+-------------+------------+--------------+ + +.. image:: results/artifactory-pull.png + :alt: PULL_TIME + :scale: 100 + +Issues which have been found during the tests +============================================= + +.. table:: Issues which have been found during the tests + + +-------------------------------+---------------------------------------------+ + |Issue description |Root cause, Link | + +===============================+=============================================+ + || Artifactory allows re-pushing|https://www.jfrog.com/jira/browse/RTFACT-9591| + || existed docker layers instead| | + || of answer with | | + || "already exists" message | | + +-------------------------------+---------------------------------------------+ + || only 5 images can be uploaded|| Root cause of the issue haven't found yet | + || to Artifactory at the || | + || same time || | + +-------------------------------+---------------------------------------------+ + +.. references: + +.. _JFrog Artifactory Pro: https://www.jfrog.com/artifactory diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-1/pull-1000-1.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-1/pull-1000-1.png new file mode 100644 index 0000000..108cdfa Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-1/pull-1000-1.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-1/push-1000-1.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-1/push-1000-1.png new file mode 100644 index 0000000..af691ea Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-1/push-1000-1.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-10/pull-1000-10.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-10/pull-1000-10.png new file mode 100644 index 0000000..72702c3 Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-10/pull-1000-10.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-10/push-1000-10.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-10/push-1000-10.png new file mode 100644 index 0000000..938a9a6 Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-10/push-1000-10.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-100/pull-1000-100.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-100/pull-1000-100.png new file mode 100644 index 0000000..bdeee77 Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-100/pull-1000-100.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-100/push-1000-100.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-100/push-1000-100.png new file mode 100644 index 0000000..ca44530 Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-100/push-1000-100.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-30/pull-1000-30.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-30/pull-1000-30.png new file mode 100644 index 0000000..fb1c316 Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-30/pull-1000-30.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-30/push-1000-30.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-30/push-1000-30.png new file mode 100644 index 0000000..c118582 Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-30/push-1000-30.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-50/pull-1000-50.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-50/pull-1000-50.png new file mode 100644 index 0000000..1deff98 Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-50/pull-1000-50.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-50/push-1000-50.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-50/push-1000-50.png new file mode 100644 index 0000000..7611885 Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-1000-50/push-1000-50.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-pull-1000-1_10_30_50_100.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-pull-1000-1_10_30_50_100.png new file mode 100644 index 0000000..2bfd274 Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-pull-1000-1_10_30_50_100.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-pull.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-pull.png new file mode 100644 index 0000000..84b1e5a Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-pull.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-push-1000-1_10_30_50_100.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-push-1000-1_10_30_50_100.png new file mode 100644 index 0000000..18a9d7b Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-push-1000-1_10_30_50_100.png differ diff --git a/doc/source/test_results/container_repositories/artifactory/results/artifactory-push.png b/doc/source/test_results/container_repositories/artifactory/results/artifactory-push.png new file mode 100644 index 0000000..1a77de9 Binary files /dev/null and b/doc/source/test_results/container_repositories/artifactory/results/artifactory-push.png differ diff --git a/doc/source/test_results/container_repositories/index.rst b/doc/source/test_results/container_repositories/index.rst new file mode 100644 index 0000000..ffbf616 --- /dev/null +++ b/doc/source/test_results/container_repositories/index.rst @@ -0,0 +1,10 @@ +Container repositories test results +*********************************** + +.. toctree:: + :numbered: + :maxdepth: 3 + + registry2/index + artifactory/index + nexus/index diff --git a/doc/source/test_results/container_repositories/nexus/Network_Scheme.png b/doc/source/test_results/container_repositories/nexus/Network_Scheme.png new file mode 100644 index 0000000..cf7975c Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/Network_Scheme.png differ diff --git a/doc/source/test_results/container_repositories/nexus/configs/server_description_of_728997-comp-disk-228.tar.gz b/doc/source/test_results/container_repositories/nexus/configs/server_description_of_728997-comp-disk-228.tar.gz new file mode 100644 index 0000000..4b5db86 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/configs/server_description_of_728997-comp-disk-228.tar.gz differ diff --git a/doc/source/test_results/container_repositories/nexus/configs/server_description_of_728998-comp-disk-227.tar.gz b/doc/source/test_results/container_repositories/nexus/configs/server_description_of_728998-comp-disk-227.tar.gz new file mode 100644 index 0000000..6ce674b Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/configs/server_description_of_728998-comp-disk-227.tar.gz differ diff --git a/doc/source/test_results/container_repositories/nexus/configs/support.zip b/doc/source/test_results/container_repositories/nexus/configs/support.zip new file mode 100644 index 0000000..6f369e1 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/configs/support.zip differ diff --git a/doc/source/test_results/container_repositories/nexus/index.rst b/doc/source/test_results/container_repositories/nexus/index.rst new file mode 100644 index 0000000..f5932d4 --- /dev/null +++ b/doc/source/test_results/container_repositories/nexus/index.rst @@ -0,0 +1,356 @@ + +.. _Measuring_performance_of_Sonatype_Nexus: + +************************************************** +Results of measuring performance of Sonatype Nexus +************************************************** + +:Abstract: + + This document includes performance test results of `Sonatype Nexus`_ service + as a repository of docker images. All test have been performed regarding + :ref:`Measuring_performance_of_container_repositories` + + +Environment description +======================= +Hardware configuration of each server +------------------------------------- + +.. table:: Description of servers hardware + + +-------+----------------+------------------------+------------------------+ + |server |name |728998-comp-disk-228 |728998-comp-disk-227 | + | +----------------+------------------------+------------------------+ + | |role |test_tool |Nexus | + | +----------------+------------------------+------------------------+ + | |vendor,model |HP,DL380 Gen9 |HP,DL380 Gen9 | + | +----------------+------------------------+------------------------+ + | |operating_system| | 3.13.0-76-generic | | 3.13.0-76-generic | + | | | | Ubuntu-trusty | | Ubuntu-trusty | + | | | | x86_64 | | x86_64 | + +-------+----------------+------------------------+------------------------+ + |CPU |vendor,model |Intel,E5-2680 v3 |Intel,E5-2680 v3 | + | +----------------+------------------------+------------------------+ + | |processor_count |2 |2 | + | +----------------+------------------------+------------------------+ + | |core_count |12 |12 | + | +----------------+------------------------+------------------------+ + | |frequency_MHz |2500 |2500 | + +-------+----------------+------------------------+------------------------+ + |RAM |vendor,model |HP,752369-081 |HP,752369-081 | + | +----------------+------------------------+------------------------+ + | |amount_MB |262144 |262144 | + +-------+----------------+------------------------+------------------------+ + |NETWORK|interface_name |p1p1 |p1p1 | + | +----------------+------------------------+------------------------+ + | |vendor,model |Intel,X710 Dual Port |Intel,X710 Dual Port | + | +----------------+------------------------+------------------------+ + | |bandwidth |10G |10G | + +-------+----------------+------------------------+------------------------+ + |STORAGE|dev_name |/dev/sda |/dev/sda | + | +----------------+------------------------+------------------------+ + | |vendor,model | | raid10 - HP P840 | | raid10 - HP P840 | + | | | | 12 disks EH0600JEDHE | | 12 disks EH0600JEDHE | + | +----------------+------------------------+------------------------+ + | |SSD/HDD |HDD |HDD | + | +----------------+------------------------+------------------------+ + | |size | 3,6TB | 3,6TB | + +-------+----------------+------------------------+------------------------+ + +Network scheme and part of configuration of hardware network switches +--------------------------------------------------------------------- +Network scheme of the environment: + +.. image:: Network_Scheme.png + :alt: Network Scheme of the environment + +Here is the part of switch configuration for each switch port which connected to +p1p1 interface of a server: + +.. code:: bash + + switchport mode trunk + switchport trunk native vlan 600 + switchport trunk allowed vlan 600-602,630-649 + spanning-tree port type edge trunk + spanning-tree bpduguard enable + no snmp trap link-status + +Software configuration of the Nexus service +---------------------------------------------------- +Installation of Nexus: +^^^^^^^^^^^^^^^^^^^^^^ +.. code:: bash + + # Install Java + apt-get install software-properties-common + sudo add-apt-repository ppa:webupd8team/java + apt-get update + sudo apt-get install oracle-java8-installer # Interactive java installer + # Install Nexus + wget http://download.sonatype.com/nexus/3/nexus-3.0.0-m7-unix.sh + chmod +x nexus-3.0.0-m7-unix.sh + echo "o + 1 + + + + + + + + + n + y + + + + + + 1 + 1 + " | ./nexus-3.0.0-m7-unix.sh -c + service nexus restart + update-rc.d nexus defaults + +After installation all default repositories was removed from Nexus and +"docker-local" hosted repository was created. You can find full configuration of +the Nexus installation in the support file created after configuration: +:download:`support.zip ` + +.. table:: Versions of some software + + +-----------+------------------+ + |Software |Version | + +===========+==================+ + |Ubuntu |Ubuntu 14.04.3 LTS| + +-----------+------------------+ + |NexusOSS |3m7 | + +-----------+------------------+ + +Operating system configuration: +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You can find outputs of some commands and /etc folder in the following archive: +:download:`server_description_of_728998-comp-disk-227.tar.gz ` + +Software configuration of the node with test tool +------------------------------------------------- +Test tool: +^^^^^^^^^^ +Firstly we need to install docker-engine: + +.. code:: bash + + echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" > /etc/apt/sources.list.d/docker.list + apt-get update && apt-get -y install docker-engine + echo DOCKER_OPTS=\"--insecure-registry 172.20.9.16:5000\" >> /etc/default/docker + service docker restart + +We use Python2.7 and +:ref:`Script for collecting performance metrics of docker repository` with +:ref:`Proposed docker file` to perform the tests. The image size is a sum of +layers: + +.. code:: bash + + IMAGE CREATED CREATED BY SIZE COMMENT + 93333b8ed564 About a minute ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/usr/s 0 B + 35d8142196c0 About a minute ago /bin/sh -c #(nop) EXPOSE 80/tcp 0 B + 3a63f30ab247 About a minute ago /bin/sh -c apt-get install -y nginx 18.14 MB + 97434d46f197 2 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B + 2 days ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kB + 2 days ago /bin/sh -c set -xe && echo '#!/bin/sh' > /u 194.5 kB + 2 days ago /bin/sh -c #(nop) ADD file:e01d51d39ea04c8efb 187.8 MB + +It means that DATA_SIZE=206.13 MB + +.. table:: Versions of some software + + +-----------+------------------+ + |Software |Version | + +===========+==================+ + |Ubuntu |Ubuntu 14.04.3 LTS| + +-----------+------------------+ + |Docker |1.10 | + +-----------+------------------+ + +Operating system: +^^^^^^^^^^^^^^^^^ +You can find outputs of some commands and /etc folder in the following archive: +:download:`server_description_of_728997-comp-disk-228.tar.gz ` + +Testing process +=============== +1. + Nexus was installed on top of 728998-comp-disk-227 server as described in + `Installation of Nexus:`_ section. + +2. + The values of the variables in test-repo.py script was changed: + iterations = 1000 + concurrency = 1 + repo_address = "172.20.9.16:5000" + +3. + The following command was executed to perform the tests: + + .. code:: bash + + sudo docker login -u jenkins -p jenkins -e jenkins@example.com + sudo python test-repo.py + +4. + push_results.csv and pull_results.csv was saved in persistent folder. + +5. + The steps from 1 to 4 was repeated with the following values of the + concurrency parameters: 1,10,30,50,100 + +Results +======= +Push action results +------------------- +PUSH_TIME(ITERATION) +^^^^^^^^^^^^^^^^^^^^ +After simple processing results the following plots for push action in depend on +iteration number created (click to expand an image): + ++----------------+----------------------------------------------------------+ +|Function |Plot | ++================+==========================================================+ +|PUSH_TIME |.. image:: results/nexus-1000-1/push-1000-1.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=1) | +|CONCURRENCY=1) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PUSH_TIME |.. image:: results/nexus-1000-10/push-1000-10.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=10) | +|CONCURRENCY=10) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PUSH_TIME |.. image:: results/nexus-1000-30/push-1000-30.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=30) | +|CONCURRENCY=30) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PUSH_TIME |.. image:: results/nexus-1000-50/push-1000-50.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=50) | +|CONCURRENCY=50) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PUSH_TIME |.. image:: results/nexus-1000-100/push-1000-100.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=100) | +|CONCURRENCY=100)| :scale: 20 | ++----------------+----------------------------------------------------------+ +|PUSH_TIME |.. image:: results/nexus-push-1000-1_10_30_50_100.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY={1,10,30,50,100}| +|CONCURRENCY={1, | :scale: 20 | +|10,30,50,100} | | ++----------------+----------------------------------------------------------+ + +PUSH_TIME(CONCURRENCY) +^^^^^^^^^^^^^^^^^^^^^^ +The following table and graph show how PUSH_TIME parameter depend on CONCURRENCY +parameter. + +.. table:: Maximum, Minimum, Average and Percentile 90% of PUSH_TIME values in + depend on CONCURRENCY parameter. + + +-----------+-----------+-----------+-----------+--------------+ + |Concurrency|Maximum |Minimum |Average |Percentile 90%| + +===========+===========+===========+===========+==============+ + |1 |19.54624987|18.28802991|18.60292332|18.85230837 | + +-----------+-----------+-----------+-----------+--------------+ + |10 |158.930537 |21.7508142 |45.62607854|48.32535088 | + +-----------+-----------+-----------+-----------+--------------+ + |30 |260.8910789|21.95701599|140.7167748|156.5025718 | + +-----------+-----------+-----------+-----------+--------------+ + |50 |295.4358571|21.76140809|220.7136473|235.8214025 | + +-----------+-----------+-----------+-----------+--------------+ + |100 |507.6230781|42.87186408|425.6215228|458.9536175 | + +-----------+-----------+-----------+-----------+--------------+ + +.. image:: results/nexus-push.png + :alt: PUSH_TIME + :scale: 100 + +Pull action results +------------------- +PULL_TIME(ITERATION) +^^^^^^^^^^^^^^^^^^^^ +After simple processing results the following plots for pull action in depend on +iteration number created (click to expand an image): + ++----------------+----------------------------------------------------------+ +|Function |Plot | ++================+==========================================================+ +|PULL_TIME |.. image:: results/nexus-1000-1/pull-1000-1.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=1) | +|CONCURRENCY=1) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PULL_TIME |.. image:: results/nexus-1000-10/pull-1000-10.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=10) | +|CONCURRENCY=10) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PULL_TIME |.. image:: results/nexus-1000-30/pull-1000-30.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=30) | +|CONCURRENCY=30) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PULL_TIME |.. image:: results/nexus-1000-50/pull-1000-50.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=50) | +|CONCURRENCY=50) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PULL_TIME |.. image:: results/nexus-1000-100/pull-1000-100.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=100) | +|CONCURRENCY=100)| :scale: 20 | ++----------------+----------------------------------------------------------+ +|PULL_TIME |.. image:: results/nexus-pull-1000-1_10_30_50_100.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY={1,10,30,50,100}| +|CONCURRENCY={1, | :scale: 20 | +|10,30,50,100} | | ++----------------+----------------------------------------------------------+ + +PULL_TIME(CONCURRENCY) +^^^^^^^^^^^^^^^^^^^^^^ +The following table and graph show how PUSH_TIME parameter depend on CONCURRENCY +parameter. + +.. table:: Maximum, Minimum, Average and Percentile 90% of PULL_TIME values in + depend on CONCURRENCY parameter. + + +-----------+------------+-------------+------------+--------------+ + |Concurrency|Maximum |Minimum |Average |Percentile 90%| + +===========+============+=============+============+==============+ + |1 |0.7448480129|0.04781007767|0.6843045886|0.7085263491 | + +-----------+------------+-------------+------------+--------------+ + |10 |1.598811865 |0.07142710686|1.180489622 |1.346029782 | + +-----------+------------+-------------+------------+--------------+ + |30 |4.289592028 |0.1032390594 |2.841079599 |3.127129436 | + +-----------+------------+-------------+------------+--------------+ + |50 |6.079101086 |0.1912419796 |4.465888512 |4.781247687 | + +-----------+------------+-------------+------------+--------------+ + |100 |10.95208812 |0.194712162 |9.210462797 |10.03164272 | + +-----------+------------+-------------+------------+--------------+ + +.. image:: results/nexus-pull.png + :alt: PULL_TIME + :scale: 100 + +Issues which have been found during the tests +============================================= + +.. table:: Issues which have been found during the tests + + +-------------------------------+---------------------------------------------+ + |Issue description |Root cause, Link | + +===============================+=============================================+ + || Nexus allows re-pushing || Docker 1.10 is known not to work with | + || existed docker layers instead|| Nexus 3.0m7 (1.10 was released after the | + || of answer with || 3.0m7 release) | + || "already exists" message || | + +-------------------------------+---------------------------------------------+ + || only 5 images can be uploaded|| Root cause of the issue haven't found yet | + || to Nexus at the || | + || same time || | + +-------------------------------+---------------------------------------------+ + +.. references: + +.. _Sonatype Nexus: http://www.sonatype.com/nexus/solution-overview/nexus-repository diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-1000-1/pull-1000-1.png b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-1/pull-1000-1.png new file mode 100644 index 0000000..9e70900 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-1/pull-1000-1.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-1000-1/push-1000-1.png b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-1/push-1000-1.png new file mode 100644 index 0000000..c6a0094 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-1/push-1000-1.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-1000-10/pull-1000-10.png b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-10/pull-1000-10.png new file mode 100644 index 0000000..0be976c Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-10/pull-1000-10.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-1000-10/push-1000-10.png b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-10/push-1000-10.png new file mode 100644 index 0000000..1e6e1f1 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-10/push-1000-10.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-1000-100/pull-1000-100.png b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-100/pull-1000-100.png new file mode 100644 index 0000000..1e71aa6 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-100/pull-1000-100.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-1000-100/push-1000-100.png b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-100/push-1000-100.png new file mode 100644 index 0000000..6f5fca2 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-100/push-1000-100.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-1000-30/pull-1000-30.png b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-30/pull-1000-30.png new file mode 100644 index 0000000..6c53783 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-30/pull-1000-30.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-1000-30/push-1000-30.png b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-30/push-1000-30.png new file mode 100644 index 0000000..b6a7d89 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-30/push-1000-30.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-1000-50/pull-1000-50.png b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-50/pull-1000-50.png new file mode 100644 index 0000000..07b1c00 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-50/pull-1000-50.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-1000-50/push-1000-50.png b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-50/push-1000-50.png new file mode 100644 index 0000000..c800926 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-1000-50/push-1000-50.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-pull-1000-1_10_30_50_100.png b/doc/source/test_results/container_repositories/nexus/results/nexus-pull-1000-1_10_30_50_100.png new file mode 100644 index 0000000..39ed5a0 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-pull-1000-1_10_30_50_100.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-pull.png b/doc/source/test_results/container_repositories/nexus/results/nexus-pull.png new file mode 100644 index 0000000..4df4026 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-pull.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-push-1000-1_10_30_50_100.png b/doc/source/test_results/container_repositories/nexus/results/nexus-push-1000-1_10_30_50_100.png new file mode 100644 index 0000000..3f7beda Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-push-1000-1_10_30_50_100.png differ diff --git a/doc/source/test_results/container_repositories/nexus/results/nexus-push.png b/doc/source/test_results/container_repositories/nexus/results/nexus-push.png new file mode 100644 index 0000000..e1e6e44 Binary files /dev/null and b/doc/source/test_results/container_repositories/nexus/results/nexus-push.png differ diff --git a/doc/source/test_results/container_repositories/registry2/Network_Scheme.png b/doc/source/test_results/container_repositories/registry2/Network_Scheme.png new file mode 100644 index 0000000..0125cd5 Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/Network_Scheme.png differ diff --git a/doc/source/test_results/container_repositories/registry2/configs/server_description_of_728997-comp-disk-228.tar.gz b/doc/source/test_results/container_repositories/registry2/configs/server_description_of_728997-comp-disk-228.tar.gz new file mode 100644 index 0000000..4b5db86 Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/configs/server_description_of_728997-comp-disk-228.tar.gz differ diff --git a/doc/source/test_results/container_repositories/registry2/configs/server_description_of_728998-comp-disk-227.tar.gz b/doc/source/test_results/container_repositories/registry2/configs/server_description_of_728998-comp-disk-227.tar.gz new file mode 100644 index 0000000..0265d18 Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/configs/server_description_of_728998-comp-disk-227.tar.gz differ diff --git a/doc/source/test_results/container_repositories/registry2/index.rst b/doc/source/test_results/container_repositories/registry2/index.rst new file mode 100644 index 0000000..dcc2ed6 --- /dev/null +++ b/doc/source/test_results/container_repositories/registry2/index.rst @@ -0,0 +1,320 @@ + +.. _Measuring_performance_of_docker_registry: + +*************************************************** +Results of measuring performance of Docker Registry +*************************************************** + +:Abstract: + + This document includes performance test results of `Docker Registry2`_ service + as a repository of docker images. All test have been performed regarding + :ref:`Measuring_performance_of_container_repositories` + + +Environment description +======================= +Hardware configuration of each server +------------------------------------- + +.. table:: Description of servers hardware + + +-------+----------------+------------------------+------------------------+ + |server |name |728998-comp-disk-228 |728998-comp-disk-227 | + | +----------------+------------------------+------------------------+ + | |role |test_tool |registry | + | +----------------+------------------------+------------------------+ + | |vendor,model |HP,DL380 Gen9 |HP,DL380 Gen9 | + | +----------------+------------------------+------------------------+ + | |operating_system| | 3.13.0-76-generic | | 3.13.0-76-generic | + | | | | Ubuntu-trusty | | Ubuntu-trusty | + | | | | x86_64 | | x86_64 | + +-------+----------------+------------------------+------------------------+ + |CPU |vendor,model |Intel,E5-2680 v3 |Intel,E5-2680 v3 | + | +----------------+------------------------+------------------------+ + | |processor_count |2 |2 | + | +----------------+------------------------+------------------------+ + | |core_count |12 |12 | + | +----------------+------------------------+------------------------+ + | |frequency_MHz |2500 |2500 | + +-------+----------------+------------------------+------------------------+ + |RAM |vendor,model |HP,752369-081 |HP,752369-081 | + | +----------------+------------------------+------------------------+ + | |amount_MB |262144 |262144 | + +-------+----------------+------------------------+------------------------+ + |NETWORK|interface_name |p1p1 |p1p1 | + | +----------------+------------------------+------------------------+ + | |vendor,model |Intel,X710 Dual Port |Intel,X710 Dual Port | + | +----------------+------------------------+------------------------+ + | |bandwidth |10G |10G | + +-------+----------------+------------------------+------------------------+ + |STORAGE|dev_name |/dev/sda |/dev/sda | + | +----------------+------------------------+------------------------+ + | |vendor,model | | raid10 - HP P840 | | raid10 - HP P840 | + | | | | 12 disks EH0600JEDHE | | 12 disks EH0600JEDHE | + | +----------------+------------------------+------------------------+ + | |SSD/HDD |HDD |HDD | + | +----------------+------------------------+------------------------+ + | |size | 3,6TB | 3,6TB | + +-------+----------------+------------------------+------------------------+ + +Network scheme and part of configuration of hardware network switches +--------------------------------------------------------------------- +Network scheme of the environment: + +.. image:: Network_Scheme.png + :alt: Network Scheme of the environment + +Here is the part of switch configuration for each switch port which connected to +p1p1 interface of a server: + +.. code:: bash + + switchport mode trunk + switchport trunk native vlan 600 + switchport trunk allowed vlan 600-602,630-649 + spanning-tree port type edge trunk + spanning-tree bpduguard enable + no snmp trap link-status + +Software configuration of the DockerRegistry service +---------------------------------------------------- +Installation of Registry2: +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. code:: bash + + echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" > /etc/apt/sources.list.d/docker.list + apt-get update && apt-get -y install docker-engine + service docker restart + docker run -d -p 5000:5000 --name registry registry:2 + +.. table:: Versions of some software + + +-----------+------------------+ + |Software |Version | + +===========+==================+ + |Ubuntu |Ubuntu 14.04.3 LTS| + +-----------+------------------+ + |Registry | | + +-----------+------------------+ + +Operating system configuration: +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You can find outputs of some commands and /etc folder in the following archive: + +:download:`server_description_of_728998-comp-disk-227.tar.gz ` + +Software configuration of the node with test tool +------------------------------------------------- +Test tool: +^^^^^^^^^^ +Firstly we need to install docker-engine: + +.. code:: bash + + echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" > /etc/apt/sources.list.d/docker.list + apt-get update && apt-get -y install docker-engine + echo DOCKER_OPTS=\"--insecure-registry 172.20.9.16:5000\" >> /etc/default/docker + service docker restart + +We use Python2.7 and +:ref:`Script for collecting performance metrics of docker repository` with +:ref:`Proposed docker file` to perform the tests. The image size is a sum of +layers: + +.. code:: bash + + IMAGE CREATED CREATED BY SIZE COMMENT + 93333b8ed564 About a minute ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/usr/s 0 B + 35d8142196c0 About a minute ago /bin/sh -c #(nop) EXPOSE 80/tcp 0 B + 3a63f30ab247 About a minute ago /bin/sh -c apt-get install -y nginx 18.14 MB + 97434d46f197 2 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B + 2 days ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kB + 2 days ago /bin/sh -c set -xe && echo '#!/bin/sh' > /u 194.5 kB + 2 days ago /bin/sh -c #(nop) ADD file:e01d51d39ea04c8efb 187.8 MB + +It means that DATA_SIZE=206.13 MB + +.. table:: Versions of some software + + +-----------+------------------+ + |Software |Version | + +===========+==================+ + |Ubuntu |Ubuntu 14.04.3 LTS| + +-----------+------------------+ + |Docker |1.10 | + +-----------+------------------+ + +Operating system: +^^^^^^^^^^^^^^^^^ +You can find outputs of some commands and /etc folder in the following archive: +:download:`server_description_of_728997-comp-disk-228.tar.gz ` + +Testing process +=============== +1. + Registry2 was installed on top of 728998-comp-disk-227 server as described in + `Installation of Registry2:`_ section. + +2. + The values of the variables in test-repo.py script was changed: + iterations = 1000 + concurrency = 1 + repo_address = "172.20.9.16:5000" + +3. + The following command was executed to perform the tests: + + .. code:: bash + + sudo python test-repo.py + +4. + push_results.csv and pull_results.csv was saved in persistent folder. + +5. + The steps from 1 to 4 was repeated with the following values of the + concurrency parameters: 1,10,30,50,100 + +Results +======= +Push action results +------------------- +PUSH_TIME(ITERATION) +^^^^^^^^^^^^^^^^^^^^ +After simple processing results the following plots for push action in depend on +iteration number created (click to expand an image): + ++----------------+----------------------------------------------------------+ +|Function |Plot | ++================+==========================================================+ +|PUSH_TIME |.. image:: results/registry-1000-1/push-1000-1.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=1) | +|CONCURRENCY=1) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PUSH_TIME |.. image:: results/registry-1000-10/push-1000-10.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=10) | +|CONCURRENCY=10) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PUSH_TIME |.. image:: results/registry-1000-30/push-1000-30.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=30) | +|CONCURRENCY=30) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PUSH_TIME |.. image:: results/registry-1000-50/push-1000-50.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=50) | +|CONCURRENCY=50) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PUSH_TIME |.. image:: results/registry-1000-100/push-1000-100.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY=100) | +|CONCURRENCY=100)| :scale: 20 | ++----------------+----------------------------------------------------------+ +|PUSH_TIME |.. image:: results/registry-push-1000-1_10_30_50_100.png | +|(ITERATION, | :alt: PUSH_TIME(ITERATION, CONCURRENCY={1,10,30,50,100}| +|CONCURRENCY={1, | :scale: 20 | +|10,30,50,100} | | ++----------------+----------------------------------------------------------+ + +PUSH_TIME(CONCURRENCY) +^^^^^^^^^^^^^^^^^^^^^^ +The following table and graph show how PUSH_TIME parameter depend on CONCURRENCY +parameter. + +.. table:: Maximum, Minimum, Average and Percentile 90% of PUSH_TIME values in + depend on CONCURRENCY parameter. + + +-----------+-----------+-----------+-----------+--------------+ + |Concurrency|Maximum |Minimum |Average |Percentile 90%| + +===========+===========+===========+===========+==============+ + |1 |18.23183703|2.014497995|2.852927562|2.120845795 | + +-----------+-----------+-----------+-----------+--------------+ + |10 |51.36455989|4.625913858|6.886669915|4.924576068 | + +-----------+-----------+-----------+-----------+--------------+ + |30 |143.376904 |14.23889208|20.4385057 |14.57682798 | + +-----------+-----------+-----------+-----------+--------------+ + |50 |45.15124679|21.27197409|24.59056571|24.24201851 | + +-----------+-----------+-----------+-----------+--------------+ + |100 |254.9175169|20.78799295|66.44495539|133.36117 | + +-----------+-----------+-----------+-----------+--------------+ + +.. image:: results/registry-push.png + :alt: PUSH_TIME + :scale: 100 + +Pull action results +------------------- +PULL_TIME(ITERATION) +^^^^^^^^^^^^^^^^^^^^ +After simple processing results the following plots for pull action in depend on +iteration number created (click to expand an image): + ++----------------+----------------------------------------------------------+ +|Function |Plot | ++================+==========================================================+ +|PULL_TIME |.. image:: results/registry-1000-1/pull-1000-1.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=1) | +|CONCURRENCY=1) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PULL_TIME |.. image:: results/registry-1000-10/pull-1000-10.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=10) | +|CONCURRENCY=10) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PULL_TIME |.. image:: results/registry-1000-30/pull-1000-30.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=30) | +|CONCURRENCY=30) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PULL_TIME |.. image:: results/registry-1000-50/pull-1000-50.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=50) | +|CONCURRENCY=50) | :scale: 20 | ++----------------+----------------------------------------------------------+ +|PULL_TIME |.. image:: results/registry-1000-100/pull-1000-100.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY=100) | +|CONCURRENCY=100)| :scale: 20 | ++----------------+----------------------------------------------------------+ +|PULL_TIME |.. image:: results/registry-pull-1000-1_10_30_50_100.png | +|(ITERATION, | :alt: PULL_TIME(ITERATION, CONCURRENCY={1,10,30,50,100}| +|CONCURRENCY={1, | :scale: 20 | +|10,30,50,100} | | ++----------------+----------------------------------------------------------+ + +PULL_TIME(CONCURRENCY) +^^^^^^^^^^^^^^^^^^^^^^ +The following table and graph show how PUSH_TIME parameter depend on CONCURRENCY +parameter. + +.. table:: Maximum, Minimum, Average and Percentile 90% of PULL_TIME values in + depend on CONCURRENCY parameter. + + +-----------+------------+-------------+------------+--------------+ + |Concurrency|Maximum |Minimum |Average |Percentile 90%| + +===========+============+=============+============+==============+ + |1 |0.7883470058|0.05074381828|0.6775195916|0.7058973074 | + +-----------+------------+-------------+------------+--------------+ + |10 |1.59649086 |0.05712890625|1.113002464 |1.204397488 | + +-----------+------------+-------------+------------+--------------+ + |30 |4.239136934 |0.1007189751 |2.70093091 |2.899113488 | + +-----------+------------+-------------+------------+--------------+ + |50 |6.978290081 |0.131428957 |4.493998793 |4.860594058 | + +-----------+------------+-------------+------------+--------------+ + |100 |13.00426912 |0.152477026 |8.819601912 |9.696622682 | + +-----------+------------+-------------+------------+--------------+ + +.. image:: results/registry-pull.png + :alt: PULL_TIME + :scale: 100 + +Issues which have been found during the tests +============================================= + +.. table:: Issues which have been found during the tests + + +-------------------------------+---------------------------------------------+ + |Issue description |Root cause, Link | + +===============================+=============================================+ + || only 5 images can be uploaded|| Root cause of the issue haven't found yet | + || to Registry at the || | + || same time || | + +-------------------------------+---------------------------------------------+ + +.. references: + +.. _Docker Registry2: https://docs.docker.com/registry diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-1000-1/pull-1000-1.png b/doc/source/test_results/container_repositories/registry2/results/registry-1000-1/pull-1000-1.png new file mode 100644 index 0000000..69ecffd Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-1000-1/pull-1000-1.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-1000-1/push-1000-1.png b/doc/source/test_results/container_repositories/registry2/results/registry-1000-1/push-1000-1.png new file mode 100644 index 0000000..f10cc5e Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-1000-1/push-1000-1.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-1000-10/pull-1000-10.png b/doc/source/test_results/container_repositories/registry2/results/registry-1000-10/pull-1000-10.png new file mode 100644 index 0000000..f00b296 Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-1000-10/pull-1000-10.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-1000-10/push-1000-10.png b/doc/source/test_results/container_repositories/registry2/results/registry-1000-10/push-1000-10.png new file mode 100644 index 0000000..5134236 Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-1000-10/push-1000-10.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-1000-100/pull-1000-100.png b/doc/source/test_results/container_repositories/registry2/results/registry-1000-100/pull-1000-100.png new file mode 100644 index 0000000..730cc84 Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-1000-100/pull-1000-100.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-1000-100/push-1000-100.png b/doc/source/test_results/container_repositories/registry2/results/registry-1000-100/push-1000-100.png new file mode 100644 index 0000000..77214ad Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-1000-100/push-1000-100.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-1000-30/pull-1000-30.png b/doc/source/test_results/container_repositories/registry2/results/registry-1000-30/pull-1000-30.png new file mode 100644 index 0000000..ae8d5fe Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-1000-30/pull-1000-30.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-1000-30/push-1000-30.png b/doc/source/test_results/container_repositories/registry2/results/registry-1000-30/push-1000-30.png new file mode 100644 index 0000000..119fd0d Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-1000-30/push-1000-30.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-1000-50/pull-1000-50.png b/doc/source/test_results/container_repositories/registry2/results/registry-1000-50/pull-1000-50.png new file mode 100644 index 0000000..e5bc842 Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-1000-50/pull-1000-50.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-1000-50/push-1000-50.png b/doc/source/test_results/container_repositories/registry2/results/registry-1000-50/push-1000-50.png new file mode 100644 index 0000000..2e478a8 Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-1000-50/push-1000-50.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-pull-1000-1_10_30_50_100.png b/doc/source/test_results/container_repositories/registry2/results/registry-pull-1000-1_10_30_50_100.png new file mode 100644 index 0000000..7f86633 Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-pull-1000-1_10_30_50_100.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-pull.png b/doc/source/test_results/container_repositories/registry2/results/registry-pull.png new file mode 100644 index 0000000..f8a8e51 Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-pull.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-push-1000-1_10_30_50_100.png b/doc/source/test_results/container_repositories/registry2/results/registry-push-1000-1_10_30_50_100.png new file mode 100644 index 0000000..d8a2acc Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-push-1000-1_10_30_50_100.png differ diff --git a/doc/source/test_results/container_repositories/registry2/results/registry-push.png b/doc/source/test_results/container_repositories/registry2/results/registry-push.png new file mode 100644 index 0000000..e009fdd Binary files /dev/null and b/doc/source/test_results/container_repositories/registry2/results/registry-push.png differ diff --git a/doc/source/test_results/index.rst b/doc/source/test_results/index.rst index fcd6f39..caef5fa 100644 --- a/doc/source/test_results/index.rst +++ b/doc/source/test_results/index.rst @@ -10,3 +10,4 @@ Test Results :maxdepth: 2 mq_ha/index + container_repositories/index