[PYTHON] Une vérification des performances du kit AWS SDK par langue

Contexte

À propos des balises

AWS peut ajouter des tags aux ressources. Les balises dans AWS sont utilisées pour la gestion des ressources et la répartition des coûts. La conception des subventions est un point très important dans le fonctionnement d'AWS. Surtout dans un environnement ou une organisation de grande taille, le nombre de balises attachées aux ressources a tendance à être très important.

SDK AWS pour les performances Ruby

Comme mentionné dans cet article, le kit SDK AWS pour Ruby obtient de nombreuses ressources à la fois lorsqu'un grand nombre de balises sont attachées aux ressources. Cela peut prendre beaucoup de temps. Ce qui suit est un graphique comparant le temps nécessaire pour terminer l'acquisition des ressources (describe_volumes) avec et sans balisage, en utilisant EBS comme exemple (l'image ci-dessous est une réimpression de l'article ci-dessus). Si vous avez un grand nombre de balises (20 dans cet exemple), vous pouvez voir que l'acquisition de ressources prend beaucoup de temps.

ruby_describe.png

Cet article a estimé que c'était la partie qui a pris le temps d'analyser le XML de la réponse de l'API à l'objet Ruby. ..

Question

Je me demandais si les changements de performances ci-dessus se produiraient dans d'autres langues du SDK AWS, j'ai donc décidé de le vérifier.

Vérification

Cette fois, en plus de Ruby, j'ai mesuré les performances avec les SDK AWS de Python, PHP, Go et Node.js. L'objectif est de ** 1000 EBS avec 20 balises **. Le client est LightSail (Ubuntu 18.04) dans la région de Tokyo. Elle est effectuée 3 fois dans chaque langue et la valeur moyenne est prise. La version de chaque langue et SDK sera décrite plus tard.

résultat de l'inspection

Les résultats de la vérification étaient les suivants. Apparemment ** seul le SDK Ruby ** a pris beaucoup de temps. Pour les autres langues, il ne semble pas y avoir d'inquiétude à ce sujet pour le moment.

秒数.png

Conclusion / Impressions

Il semble que seul le SDK AWS pour Ruby prenne beaucoup de temps à traiter avec une configuration comme celle-ci. En ce qui concerne le SDK Ruby, les performances peuvent être améliorées en améliorant la bibliothèque utilisée en interne, je voudrais donc m'y attendre à l'avenir.

Version et code de vérification pour chaque langue et SDK

Langue SDK
Ruby 2.6.3 3.89.1
PHP 7.2 3.133.34
Python 3.7.1 1.2
Node.js 12.14.0 2.638.0
Go 1.13.4 1.29.22

Ruby

require 'aws-sdk-ec2'

Aws.config.update(credentials: Aws::Credentials.new('',''))
ec2_client = Aws::EC2::Client.new(region: 'ap-northeast-1')

start_time = Time.now

ec2_client.describe_volumes

end_time = Time.now
colapsed_time = end_time - start_time
puts colapsed_time

PHP

<?php
require 'vendor/autoload.php';

use Aws\Ec2\Ec2Client;

$ec2Client = new Aws\Ec2\Ec2Client([
  'region' => 'ap-northeast-1',
  'version' => '2016-11-15',
]);

$time_start = microtime(true);

$result = $ec2Client->describeVolumes();

$time = microtime(true) - $time_start;
echo "{$time}Secondes";

Python

import boto3
import time

ec2 = boto3.client('ec2')
start = time.time()

ec2.describe_volumes()

elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time))

Node.js

var AWS = require('aws-sdk');

AWS.config.update({region: 'ap-northeast-1'});

var ec2 = new AWS.EC2();
const startTime = Date.now(); //Heure de début
ec2.describeVolumes({}, function (err, data) {
  console.log(Date.now() - startTime);
});

Go

package main

import (
	"fmt"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/ec2"
)

func main() {
    sess, _ := session.NewSession(&aws.Config{
        Region: aws.String("ap-northeast-1")},
    )

    svc := ec2.New(sess)
    input := &ec2.DescribeVolumesInput{}

    start := time.Now()
    svc.DescribeVolumes(input)
    end := time.Now()
    fmt.Printf("%f secondes\n", (end.Sub(start)).Seconds())
}

Recommended Posts

Une vérification des performances du kit AWS SDK par langue
Vérification des performances du prétraitement des données dans le traitement du langage naturel
Proposition d'un nouveau framework de langage de bouclier linguistique
Résumé des pages d'hébergement de la bibliothèque par langue
Un ensemble d'entiers qui satisfait ax + by = 1.
Mémorandum d'extraction par requête python bs4
Obtenez la liste "J'aime" de Qiita en grattant
Amélioration de la metrix de performance par modèle d'apprentissage en 2 étapes
Informations d'identification utilisées par Boto3 (AWS SDK for Python)
Comparaison de vitesse de chaque langue par la méthode de Monte Carlo
Regrouper par éléments consécutifs d'une liste en Python