AWS kann Tags zu Ressourcen hinzufügen. Tags in AWS werden für das Ressourcenmanagement und die [Kostenzuordnung] verwendet (http://blog.serverworks.co.jp/tech/2019/07/29/cost-alloc-tags-basic/). Das Grant-Design ist ein sehr wichtiger Punkt im Betrieb von AWS. Insbesondere in einer großen Umgebung oder Organisation ist die Anzahl der an Ressourcen angehängten Tags in der Regel sehr groß.
Wie in diesem Artikel erwähnt, erhält das AWS SDK für Ruby viele Ressourcen gleichzeitig, wenn viele Tags an die Ressourcen angehängt werden. Kann viel Zeit in Anspruch nehmen. Das folgende Diagramm vergleicht anhand des Beispiels EBS, wie lange es gedauert hat, die Ressourcenerfassung (description_volumes) mit und ohne Tagging abzuschließen (das folgende Bild ist ein Nachdruck des obigen Artikels). Wenn Sie eine große Anzahl von Tags haben (in diesem Beispiel 20), können Sie feststellen, dass der Abschluss der Ressourcenerfassung sehr lange dauert.
Dieser Artikel schätzte, dass es der Teil war, der die Zeit brauchte, um das XML der API-Antwort auf das Ruby-Objekt zu analysieren. ..
Ich habe mich gefragt, ob die oben genannten Leistungsänderungen in anderen Sprachen des AWS SDK auftreten würden, und habe mich daher entschlossen, dies zu überprüfen.
Dieses Mal habe ich zusätzlich zu Ruby die Leistung mit den AWS SDKs von Python, PHP, Go und Node.js gemessen. Das Ziel sind ** 1000 EBSs mit 20 Tags **. Der Client ist LightSail (Ubuntu 18.04) in der Region Tokio. Es wird dreimal in jeder Sprache durchgeführt und der Durchschnittswert ermittelt. Die Version jeder Sprache und jedes SDK wird später beschrieben.
Die Verifizierungsergebnisse waren wie folgt. Anscheinend hat ** nur das Ruby SDK ** viel Zeit in Anspruch genommen. Für andere Sprachen scheint es vorerst keine Bedenken zu geben.
Es scheint, dass nur das AWS SDK für Ruby viel Zeit für die Verarbeitung mit einer solchen Konfiguration benötigt. Was das Ruby SDK betrifft, kann die Leistung durch eine Verbesserung der intern verwendeten Bibliothek verbessert werden, daher würde ich es gerne in Zukunft erwarten.
Sprache | 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}Sekunden";
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(); //Startzeit
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 Sekunden\n", (end.Sub(start)).Seconds())
}
Recommended Posts