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.
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.
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. ..
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.
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.
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.
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.
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