Cloudcomputing ist längst kein Trend mehr, sondern ein Bestandteil moderner IT-Architekturen. Für Unternehmen, die ihre Agilität und Skalierbarkeit erhöhen möchten, ist die Cloud ein unverzichtbares Werkzeug. Doch mit deren wachsendem Einsatz kommt eine zentrale Herausforderung auf Admins zu: die Performance. In diesem Beitrag zeigen wir, wo Flaschenhälse lauern und wie Sie diese beseitigen.
Die Performance einer Cloudumgebung wird von einer Vielzahl von Faktoren beeinflusst, die in ihrer Gesamtheit darüber entscheiden, wie schnell und effizient Anwendungen und Dienste bereitgestellt werden. Ein tiefes Verständnis dieser Einflussfaktoren ermöglicht es Ihnen als IT-Administrator, gezielt an Stellschrauben zu drehen und Engpässe zu eliminieren. Im Folgenden beleuchten wir die wichtigsten Komponenten, die für die Performance in einer Cloudumgebung von Bedeutung sind.
Eine der größten Herausforderungen in der Cloud ist die Netzwerklatenz. Dabei spielen sowohl die externe als auch die interne Netzwerklatenz eine Rolle. Externe Latenz entsteht durch die Entfernung zwischen Ihrem Rechenzentrum und der Cloudinfrastruktur eines Anbieters. Faktoren wie die physische Distanz, die Anzahl der Hops im Netzwerkpfad und die Qualität der Internetverbindung haben hier einen direkten Einfluss.
Interne Netzwerklatenz bezieht sich hingegen auf die Kommunikation innerhalb der Cloudinfrastruktur. Hier sind Faktoren wie die Netzwerkarchitektur des Cloudanbieters und die Implementierung von Software-defined Networking (SDN) entscheidend. Durch die gezielte Auswahl von Regionen, Zonen und Edge-Standorten sind Sie jedoch in der Lage, die Netzwerklatenz zu reduzieren.
Die Performance einer Cloudumgebung wird von einer Vielzahl von Faktoren beeinflusst, die in ihrer Gesamtheit darüber entscheiden, wie schnell und effizient Anwendungen und Dienste bereitgestellt werden. Ein tiefes Verständnis dieser Einflussfaktoren ermöglicht es Ihnen als IT-Administrator, gezielt an Stellschrauben zu drehen und Engpässe zu eliminieren. Im Folgenden beleuchten wir die wichtigsten Komponenten, die für die Performance in einer Cloudumgebung von Bedeutung sind.
Eine der größten Herausforderungen in der Cloud ist die Netzwerklatenz. Dabei spielen sowohl die externe als auch die interne Netzwerklatenz eine Rolle. Externe Latenz entsteht durch die Entfernung zwischen Ihrem Rechenzentrum und der Cloudinfrastruktur eines Anbieters. Faktoren wie die physische Distanz, die Anzahl der Hops im Netzwerkpfad und die Qualität der Internetverbindung haben hier einen direkten Einfluss.
Interne Netzwerklatenz bezieht sich hingegen auf die Kommunikation innerhalb der Cloudinfrastruktur. Hier sind Faktoren wie die Netzwerkarchitektur des Cloudanbieters und die Implementierung von Software-defined Networking (SDN) entscheidend. Durch die gezielte Auswahl von Regionen, Zonen und Edge-Standorten sind Sie jedoch in der Lage, die Netzwerklatenz zu reduzieren.
Was Nutzer noch als tolerierbar empfinden, hängt stark von der Art der Anwendung und deren Anforderungen ab. Für einige Applikationen, insbesondere Echtzeitdienste wie VoIP, Gaming oder Finanzhandel, sind extrem geringe Latenzen erforderlich. Andere Anwendungen wie Batch-Processing-Tasks oder datenintensive Backups tolerieren höhere Latenzzeiten:
- < 1 ms: Dies ist das ideale Ziel für hochperformante, latenzempfindliche Anwendungen, die in Echtzeit arbeiten müssen, wie etwa Finanzhandelssysteme oder Echtzeitanalysen.
- 1 bis 10 ms: Für Anwendungen wie Webanwendungen, Datenbankabfragen oder In-Memory-Processing können Latenzen in diesem Bereich noch als akzeptabel gelten.
- 10 bis 50 ms: Dies ist für viele Standardanwendungen wie E-Commerce-Websites, API-Abfragen und Content-Delivery-Dienste noch ein tolerierbarer Bereich. Allerdings nehmen Benutzer unter Umständen bereits Verzögerungen wahr.
- > 50 ms: In diesem Bereich wirken Anwendungen, insbesondere solche, die schnelle Interaktionen erfordern (etwa Gaming, Videoanrufe), für Endbenutzer eventuell träge oder verzögert.
- > 100 ms: Solche hohen Latenzen gelten in der Regel als inakzeptabel, insbesondere wenn es um Benutzerinteraktionen oder Echtzeitanwendungen geht. Hier sind Maßnahmen zur Reduktion dringend erforderlich.
Latenzen zuverlässig bestimmen
Um die Latenz in einer Cloud zu messen, bietet sich eine Vielzahl von Tools und Metriken an. Es ist dabei wichtig, sowohl die Netzwerklatenz als auch die Anwendungslatenz zu berücksichtigen. Diese grundlegenden Tools sind hilfreich, um die Latenz zwischen Ihrem System und der Cloudinstanz zu messen. Mit messen Sie die Round-Trip Time (RTT) eines Pakets, während den Netzwerkpfad aufzeigt und Engpässe oder Verzögerungen sichtbar macht.
Im Bereich der Cloudanbieter-spezifischen Tools ermöglicht AWS CloudWatch [1] das Monitoring der Latenz Ihrer AWS-Ressourcen wie EC2-Instanzen oder Elastic Loadbalancers. Sie können auch benutzerdefinierte Metriken einrichten, um spezielle Latenzpunkte in Ihrer Infrastruktur zu überwachen. Azure Monitor [2] auf der anderen Seite bietet detaillierte Metriken zur Überwachung der Latenzzeiten in verschiedenen Azure-Diensten und ermöglicht eine granulare Überprüfung der Netzwerkkonnektivität. In der Google-Cloud kommt derweil das "Google Cloud Monitoring" [3] zum Einsatz und ermöglicht die Überwachung der Latenzzeiten in Ihrer GCP-Infrastruktur und bietet Einblicke in die Leistung Ihrer Anwendungen.
Werkzeuge für das Application Performance Monitoring (APM) gehen hingegen über die reine Netzwerklatenz hinaus und messen auch die Latenz innerhalb der Anwendung. Zu den bekanntesten gehören
- Datadog [4]: Zeigt die Latenz in Ihrer gesamten Infrastruktur und stellt damit sicher, dass Sie eine Übersicht über Netzwerklatenz und Anwendungslatenz erhalten.
- New Relic [5]: Bietet detaillierte Einblicke in die End-to-End-Latenz von cloudbasierten Anwendungen und hilft, Engpässe in der Anwendungsarchitektur zu erkennen.
- Prometheus und Grafana [6]: Diese Open-Source-Lösung ermöglicht es, benutzerdefinierte Metriken zu erfassen und zu visualisieren, einschließlich der Latenz auf Netzwerk- und Anwendungsebene.
Tools für das Real User Monitoring (RUM) wie Dynatrace oder Google Analytics ermöglichen zudem die Überwachung der Latenz aus der Perspektive des Endnutzers, was oft der beste Indikator für die tatsächliche Nutzererfahrung ist.
Maßnahmen zur Reduzierung der Latenz
Sobald die Latenzprobleme erkannt sind, stehen Ihnen verschiedene Maßnahmen zur Verfügung, um die Latenz in Ihrer Cloudumgebung zu verringern. Durch den Einsatz von Edge Computing und CDNs bringen Sie Daten und Anwendungen näher an die Endbenutzer. CDNs wie Cloudflare, Akamai oder AWS CloudFront verteilen Inhalte auf Server in geografisch verteilten Standorten, was die Netzwerklatenz erheblich reduziert, da die Daten nicht mehr von einem zentralen Server abgerufen werden müssen.
Die Wahl des Rechenzentrums, in dem Ihre Cloudressourcen liegen, spielt eine entscheidende Rolle. Es ist sinnvoll, Cloudregionen und -zonen zu wählen, die geografisch nahe bei den Endbenutzern liegen. Cloudanbieter wie AWS, Azure und Google Cloud bieten eine Vielzahl von Regionen weltweit an, und durch die Wahl einer näher gelegenen Region können Sie Latenzzeiten deutlich senken.
Gut konfigurierte Virtual Private Clouds (VPCs) tragen darüber hinaus dazu bei, interne Netzwerklatenzen zu reduzieren – insbesondere durch den Einsatz von VPC-Peering, um Verbindungen zwischen verschiedenen Netzwerken zu optimieren. Clouddienste wie AWS Direct Connect oder Azure ExpressRoute bieten dedizierte Netzwerkverbindungen zwischen Ihrem Rechenzentrum und der Cloud, die nicht über das öffentliche Internet laufen. Diese Verbindungen sind schneller und zuverlässiger, was die Latenz erheblich reduzieren kann.
Netzwerk-Hops treten auf, wenn Datenpakete über mehrere Router und Netzwerkgeräte weitergeleitet werden. Je mehr Hops ein Paket durchläuft, desto höher ist die Latenz. Durch die Nutzung direkter Verbindungen oder optimierter Routen können Sie die Anzahl der Hops reduzieren. SDN hilft dabei, Netzwerkpfade dynamisch zu optimieren und so die Hops und damit die Latenz zu verringern.
Durch das Komprimieren von Daten vor der Übertragung lässt sich außerdem die Menge der zu übertragenden Informationen reduzieren und damit die Latenz verringern. Ein Caching auf verschiedenen Ebenen – sei es auf der Clientseite, innerhalb der Datenbank oder durch den Einsatz von CDNs – kann wiederum dazu beitragen, häufig abgefragte Inhalte direkt und schneller bereitzustellen, ohne dass sie jedes Mal neu vom Server abgerufen werden müssen.
Latenzmetriken im Überblick
- Round-Trip Time (RTT): Die Zeit, die ein Paket benötigt, um von einem Client zum Server zu gelangen und zurück.- Time to First Byte (TTFB): Diese Metrik misst die Zeit, die vergeht, bis der erste Datenblock von einem Server an den Client gesendet wird. Eine hohe TTFB deutet eventuell auf ein Problem auf Serverseite oder in der Netzwerkinfrastruktur hin.- Throughput: Während die Latenz sich auf die Verzögerung bezieht, gibt der Durchsatz die mögliche Datenmenge pro Sekunde an. Beide sind miteinander verknüpft, da hohe Latenzen oft zu einem geringeren Durchsatz führen.
Loadbalancing und Caching
Loadbalancer sind essenziell, um Anfragen gleichmäßig über mehrere Server oder Instanzen zu verteilen, was die Systemstabilität und -verfügbarkeit erhöht. Sie spielen eine Schlüsselrolle, wenn es darum geht, Engpässe zu vermeiden und die Nutzung von Rechenressourcen zu maximieren:
- L4- versus L7-Loadbalancing: Layer-4-(Transport-Layer) Loadbalancer arbeiten auf der Netzwerkebene und verteilen Traffic basierend auf IP-Adressen und Ports. Die Lastverteilung auf Layer 7 (Application-Layer) bietet mehr Kontrolle und Flexibilität, da sie basierend auf HTTP-Anfragen, Headern und Inhalten entscheidet, wie der Traffic verteilt wird. Viele Cloudanbieter wie AWS mit dem Elastic Loadbalancing oder der Azure-Loadbalancer unterstützen beide Varianten.
- Geo-Loadbalancing: Bei global verteilten Anwendungen hilft dieses Verfahren dabei, den Traffic zu dem Rechenzentrum zu leiten, das geografisch dem Benutzer am nächsten ist. Das minimiert die Netzwerklatenz und verbessert die Benutzererfahrung.
- Health Checks und Failover: Loadbalancer führen regelmäßig Health Checks durch, um sicherzustellen, dass nur gesunde Instanzen Traffic erhalten. Sollte eine Instanz ausfallen, wird der Traffic automatisch an eine funktionierende Instanz umgeleitet. Dies erhöht die Ausfallsicherheit und gewährleistet eine kontinuierliche Verfügbarkeit.
Der schnellste Traffic ist jedoch der, der gar nicht erst durch das Netzwerk fließen muss. Dank des Speicherns häufiger Anfragen oder Daten in einem schnelleren Zwischenspeicher (Cache) lassen sich Antwortzeiten drastisch reduziert und die Belastung der Hauptressourcen verringern:
- Clientseitiges Caching: Daten werden im Browser oder auf dem Endgerät des Benutzers zwischengespeichert, was die Anzahl der Anfragen an den Server reduziert und die Antwortzeiten verkürzt.
- Datenbank-Caching: Häufig verwendete Datenbankabfragen lagern im Cache zwischen, um direkte Datenbankzugriffe zu vermeiden. Dienste wie Amazon ElastiCache (unterstützt Memcached und Redis) bieten In-Memory Caching-Lösungen, die extrem schnelle Lese- und Schreibzugriffe ermöglichen.
- CDNs (Content Delivery Networks): Ein CDN speichert statische Inhalte (wie Bilder, Videos oder JavaScript-Dateien) an mehreren geografisch verteilten Standorten und liefert diese aus, wenn Benutzer darauf zugreifen. Dadurch verringern Sie die Netzwerklast und die Ladezeiten für Endbenutzer. Bekannte CDNs sind Cloudflare, AWS CloudFront und Akamai.
- Application-Level Caching: Viele Frameworks und Plattformen bieten integrierte Caching-Mechanismen, die Zwischenergebnisse oder Daten vorhalten. Dies reduziert die Rechenleistung, die für wiederkehrende Aufgaben benötigt wird.
Ein häufiges Problem im Zusammenhang mit Caching ist die Konsistenz der Daten. Stellen Sie daher sicher, dass Ihr Caching-System effektiv Cache-Invalidierungsstrategien unterstützt, um veraltete Daten zu vermeiden. Strategien wie Time-to-Live (TTL) oder Cache-Busting helfen dabei, Caches zu aktualisieren und konsistent zu halten.
Die passende Cloudarchitektur finden
Cloudumgebungen bieten zahlreiche Möglichkeiten zur Optimierung, die über herkömmliche IT-Infrastrukturen hinausgehen. Ein entscheidender Vorteil der Cloud ist ihre Flexibilität, wodurch Ressourcen dynamisch angepasst und gezielt optimiert werden können.
Eine der wichtigsten Optimierungsstrategien ist die richtige Auswahl der Cloudarchitektur. Public Clouds bieten Skalierbarkeit und Flexibilität, jedoch kann eine Hybrid- oder Multicloud-Strategie sinnvoll sein, um die Stärken verschiedener Anbieter zu kombinieren. Eine Multicloud-Nutzung ermöglicht es Ihnen, die jeweils leistungsstärksten Dienste unterschiedlicher Anbieter zu nutzen, was die Performance verbessert und die Ausfallsicherheit erhöht.
Serverless-Architekturen stellen eine weitere cloudspezifische Optimierung dar. Dienste wie AWS Lambda oder Azure Functions erlauben es, Code nur bei Bedarf auszuführen, was sowohl die Ressourcen effizienter nutzt als auch die Latenz minimiert. Serverless bietet zudem die Möglichkeit, automatisch zu skalieren, ohne dass Administrationsaufwand entsteht, was zu einer höheren Reaktionsfähigkeit führt.
Auch die Optimierung des Cloudspeichers dürfen Sie nicht außer Acht lassen. Durch das Automatische Tiering von Daten – etwa in Amazon S3 oder Google Cloud Storage – werden selten genutzte Daten in günstigere, langsamere Speicherklassen verschoben, während häufig benötigte Daten in schnellen, aber teureren Speicherlösungen bleiben. Zusätzlich verbessert Datendeduplizierung die Speichernutzung und reduziert die Speicherlast für eine bessere Gesamtperformance.
Cloudanbieter stellen zudem regionale und zonale Verfügbarkeitsmodelle bereit, mit denen Sie Ihre Ressourcen geografisch verteilen können, um Latenz zu minimieren und Redundanz zu gewährleisten. Die Wahl der richtigen Region in der Nähe Ihrer Benutzer oder Geschäftszentren kann die Netzwerklatenz erheblich senken und die Nutzererfahrung verbessern.
Ressourcenverwaltung und Skalierbarkeit
Cloudanbieter stellen eine Vielzahl von Instanztypen und Speicheroptionen zur Verfügung, die Sie an die spezifischen Anforderungen Ihrer Anwendungen anpassen müssen. Eine Fehlkonfiguration kann zu Performance-Einbußen oder zu unnötig hohen Kosten führen. Um eine bessere Leistung herauszukitzeln, müssen Sie Ihren Anwendungen ausreichend CPU-Kapazität und Arbeitsspeicher zuweisen.
Dabei gilt es auf der anderen Seite, eine Überprovisionierung und damit unnötige Kosten zu vermeiden. Eine dynamische Skalierung kann helfen, diese Balance zu halten, indem Ressourcen automatisch zu- oder abgebucht werden, je nach Last. Ein Kernprinzip in der Cloud ist glücklicherweise die Möglichkeit, Ressourcen dynamisch anzupassen, um Lastspitzen oder Engpässe zu bewältigen. Dabei unterscheiden wir zwischen vertikaler und horizontaler Skalierung:
- Vertikale Skalierung (Scaling Up/Down): Dieses Verfahren erhöht oder verringert die Kapazität einer einzelnen Instanz, etwa durch mehr CPU oder RAM. Dies ist einfach umzusetzen, allerdings stoßen Sie hier schnell an die Grenzen der maximal verfügbaren Hardware-Ressourcen.
- Horizontale Skalierung (Scaling Out/In): Hier liegt der Fokus auf der Anzahl der Instanzen oder Server. Die horizontale Skalierung ist besonders effektiv für verteilte Anwendungen und Microservices-Architekturen und sorgt für eine verbesserte Redundanz sowie höhere Verfügbarkeit.
Cloudanbieter bieten Tools wie AWS Auto Scaling, Google Cloud Instance Groups oder Azure Virtual Machine Scale Sets, die die Anzahl der Instanzen basierend auf definierten Metriken automatisch anpassen. Diese Metriken können CPU-Auslastung, Speicherbedarf oder Netzwerktraffic umfassen. Der Vorteil liegt darin, dass Ressourcen automatisch auf Basis der tatsächlichen Auslastung bereitgestellt oder entfernt werden, ohne dass ein manueller Eingriff notwendig ist. Dies optimiert nicht nur die Performance, sondern minimiert auch Kosten durch eine effizientere Ressourcennutzung.
Auch die Wahl der Speichertechnologie hat einen direkten Einfluss auf die Performance. Blockspeicher (etwa Amazon EBS) bieten häufig geringere Latenzen und höhere IOPS (Input/Output Operations Per Second) als klassische Dateisysteme, während Objektspeicher (um Beispiel Amazon S3) für Anwendungen geeignet sind, die skalierbaren und kosteneffizienten Speicherplatz benötigen. Hier ist es wichtig, die Art des Speichers an die Lese- und Schreibanforderungen Ihrer Anwendung anzupassen.
Virtualisierung versus Containerisierung
Für die Bereitstellung von Anwendungen in der Cloud stehen zwei dominierende Technologien bereit: Virtualisierung und Containerisierung. Beide haben ihre Vor- und Nachteile und die Wahl hängt stark von den Anforderungen der Anwendung ab.
In virtualisierten Umgebungen läuft jede Anwendung in einer eigenen virtuellen Maschine (VM), die über ein eigenes Betriebssystem und isolierte Ressourcen verfügt. Diese Isolierung bietet zwar Sicherheit und Flexibilität, bringt aber auch einen Overhead durch den Hypervisor mit sich. VM-basierte Umgebungen eignen sich gut für traditionelle monolithische Anwendungen oder Anwendungen, die eine strikte Isolation benötigen. Während VMs eine hohe Sicherheit und Flexibilität bieten, ist die Skalierung langsamer und der Ressourcenverbrauch aufgrund des Overheads höher.
Container wie Docker stellen eine leichtere und effizientere Alternative zur Virtualisierung dar. Sie teilen sich den Kernel des Host-Betriebssystems, was den Overhead reduziert und schnellere Startzeiten ermöglicht. Container eignen sich besonders für Microservices-Architekturen und Anwendungen, die auf schnelles Deployment und Skalierung angewiesen sind. Im Fokus stehen damit Anwendungen, die in kleineren, modularen Services (Microservices) entwickelt und häufig aktualisiert werden. Die Art der Virtualisierung ist extrem leichtgewichtig, was die Performance verbessert. Dafür ist die Isolation schwächer als bei VMs und bei schlecht konfigurierten Containern treten möglicherweise Sicherheitslücken auf.
Für den effizienten Betrieb von containerisierten Anwendungen ist eine Container-Orchestrierungsplattform wie Kubernetes unerlässlich. Kubernetes automatisiert das Deployment, die Skalierung und das Management von Container-Anwendungen, wodurch Ressourcen effizient genutzt und die Verfügbarkeit gesteigert wird. Mit der richtigen Orchestrierung können Sie Container automatisch skalieren, wenn die Nachfrage steigt, und auf der anderen Seite nicht benötigte Container herunterfahren, was zu einer deutlich besseren Ressourcennutzung führt.
Monitoring und Metriken
Effektives Monitoring ist entscheidend, um die Performance Ihrer Cloudinfrastruktur zu überwachen und rechtzeitig auf Engpässe zu reagieren. Im Folgenden eine Übersicht der wichtigsten Metriken und Tools, die Sie im Auge behalten sollten.
Wichtige Metriken
- CPU-Auslastung: Überwachen Sie die durchschnittliche und maximale CPU-Nutzung Ihrer Instanzen. Eine dauerhafte Auslastung über 80 Prozent weist auf Ressourcenengpässe hin.- RAM-Nutzung: Ein häufig überlasteter Arbeitsspeicher kann die Performance stark beeinträchtigen. Halten Sie die RAM-Nutzung unter 75 Prozent.
- Disk-I/O (Input/Output Operations Per Second, IOPS): Überwachen Sie die Lese- und Schreibgeschwindigkeiten Ihrer Speicherlösungen, um Engpässe zu vermeiden.
- Netzwerktraffic und Latenz: Messen Sie die Datenübertragungsraten und überwachen Sie die Netzwerklatenz, um mögliche Netzwerk-Flaschenhälse frühzeitig zu erkennen.
- Datenbank-Performance: Überwachen Sie Abfragezeiten, Latenzen und Verbindungen, um sicherzustellen, dass Ihre Datenbank keine Engpässe verursacht.
Monitoringtools
- AWS CloudWatch, Azure Monitor, Google Cloud Monitoring: Diese nativen Tools bieten detaillierte Einblicke in die Performance Ihrer Cloudressourcen und ermöglichen das Setzen von Alarmen bei bestimmten Schwellenwerten.
- Datadog, New Relic, Prometheus und Grafana: Diese Tools bieten umfangreiche Dashboards zur Überwachung von CPU, RAM, Disk-I/O und Netzwerkmetriken in Echtzeit.
- Zabbix, Nagios: Open-Source-Werkzeuge für ein umfassendes Infrastruktur-Monitoring, die sich für Hybrid- und Multicloud-Umgebungen anbieten.
Automatisierte Alarme und Fehlerbehebung
Richten Sie automatisierte Alarme für kritische Metriken ein, um sofort informiert zu werden, wenn ein Schwellenwert überschritten wird. Mit Tools wie AWS Lambda, Azure Logic Apps oder Google Cloud Functions definieren Sie automatisierte Reaktionen auf Probleme wie das automatische Starten zusätzlicher Instanzen oder das Reduzieren der Last durch Loadbalancer.
Fazit
Der Gang in die Cloud bringt viele Vorteile mit sich, etwa eine flexible Skalierung der Ressourcen. Doch erweist sich die Performance-Optimierung hierbei als komplexe Aufgabe für Admins. Sie erfordert eine durchdachte Kombination aus skalierbaren Architekturen, effizientem Ressourcenmanagement und gezielter Kostenoptimierung. Durch den Einsatz von Autoscaling, Loadbalancing und modernen Technologien wie Serverless Computing und Containerisierung lässt sich die Performance erheblich steigern, während gleichzeitig eine flexible und kostenbewusste Nutzung der Cloudressourcen gewährleistet wird.
Letztlich hängt der Erfolg von einer kontinuierlichen Überwachung und Anpassung ab. Die Wahl der passenden Architektur sowie Optimierungsstrategien ermöglicht es Ihnen, nicht nur die Performance auf ein Maximum zu bringen, sondern auch die Kosten unter Kontrolle zu halten. Eine gezielte Performance- und Kostenoptimierung etwa durch Right-Sizing-Tools und Autoscaling sorgt dafür, dass Ihre Cloudumgebung nicht nur in Sachen Leistung effizient arbeitet.