Optimierung der Leistung von Amazon FSx für Lustre in Knoten (nicht EFA) - Amazon EKS

Unterstützung für die Verbesserung dieser Seite beitragen

Um zu diesem Benutzerhandbuch beizutragen, klicken Sie auf den Link Diese Seite auf GitHub bearbeiten, der sich im rechten Bereich jeder Seite befindet.

Optimierung der Leistung von Amazon FSx für Lustre in Knoten (nicht EFA)

Sie können die Leistung von Amazon FSx für Lustre optimieren, indem Sie während der Knoten-Initialisierung Optimierungsparameter mithilfe von Benutzerdaten der Startvorlage anwenden.

Anmerkung

Warum Benutzerdaten von Startvorlagen verwenden?

  • Wendet Optimierungen automatisch während der Knoten-Initialisierung an.

  • Gewährleistet eine konsistente Konfiguration auf allen Knoten.

  • Macht die manuelle Knotenkonfiguration überflüssig.

Übersicht über das Beispiel-Skript

Das in diesem Thema definierte Beispiel-Skript führt die folgenden Vorgänge aus:

# 1. Install Lustre client

  • Automatische Erkennung Ihrer Betriebssystemversion: Amazon Linux 2 (AL2) oder Amazon Linux 2023 (AL2023).

  • Installation des entsprechenden Lustre-Client-Pakets.

# 2. Apply network and RPC tunings

  • Festlegen von ptlrpcd_per_cpt_max=64 für die parallele RPC-Verarbeitung.

  • Konfiguriert ksocklnd credits=2560 zur Optimierung der Netzwerkpuffer.

# 3. Load Lustre modules

  • Sichere Entfernung vorhandener Lustre-Module, falls vorhanden.

  • Entfernt vorhandene eingebundene Dateisysteme.

  • Lädt aktuelle Lustre-Module.

# 4. Lustre Network Initialization

  • Initialisiert die Lustre-Netzwerkkonfiguration.

  • Richtet die erforderlichen Netzwerkparameter ein.

# 5. Mount FSx filesystem

  • In diesem Abschnitt müssen Sie die Werte für Ihre Umgebung anpassen.

# 6. Apply tunings

  • LRU-Abstimmungen (Lock Resource Unit):

    • lru_max_age=600000

    • lru_size berechnet basierend auf der CPU-Anzahl

  • Client-Cache-Steuerung: max_cached_mb=64

  • RPC-Steuerungen

    • OST max_rpcs_in_flight=32

    • MDC max_rpcs_in_flight=64

    • MDC max_mod_rpcs_in_flight=50

# 7. Verify tunings

  • Überprüft alle angewendeten Abstimmungen.

  • Meldet Erfolg oder Warnung für jeden Parameter.

# 8. Setup persistence

  • Auch in diesem Abschnitt müssen Sie die Werte für Ihre Umgebung anpassen.

  • Erkennt automatisch Ihre Betriebssystemversion (AL2 oder AL2023), um zu bestimmen, welcher Systemd-Service angewendet werden soll.

  • Das System startet.

  • Systemd startet den lustre-tunings-Service (aufgrund von WantedBy=multi-user.target).

  • Service führt apply_lustre_tunings.sh aus, das:

    • Überprüft, ob das Dateisystem eingebunden ist.

    • Bindet das Dateisystem, falls es noch nicht eingebunden ist.

    • Wartet auf erfolgreiche Einbindung (bis zu fünf Minuten).

    • Wendet nach erfolgreicher Einbindung die Abstimmungsparameter an.

  • Einstellungen bleiben bis zum Neustart aktiv.

  • Service wird nach Abschluss des Skripts beendet.

    • Systemd kennzeichnet den Service als „aktiv (beendet)“.

  • Der Vorgang wiederholt sich beim nächsten Neustart.

Erstellen einer Startvorlage

  1. Öffnen Sie die Amazon EC2-Konsole unter https://console.aws.amazon.com/ec2/.

  2. Wählen Sie Startvorlagen aus.

  3. Wählen Sie Startvorlage erstellen.

  4. Suchen Sie unter Erweiterte Details den Abschnitt Benutzerdaten.

  5. Fügen Sie das folgende Skript ein und aktualisieren Sie es nach Bedarf.

    Wichtig

    Passen Sie diese Werte sowohl im Abschnitt # 5. Mount FSx filesystem als auch in der setup_persistence()-Funktion von apply_lustre_tunings.sh im Abschnitt # 8. Setup persistence an Ihre Umgebung an:

    FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted. MOUNT_NAME="<your-mount-name>" # Needs to be adjusted. MOUNT_POINT="</your/mount/point>" # Needs to be adjusted.
    MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==MYBOUNDARY==" --==MYBOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash exec 1> >(logger -s -t $(basename $0)) 2>&1 # Function definitions check_success() { if [ $? -eq 0 ]; then echo "SUCCESS: $1" else echo "FAILED: $1" return 1 fi } apply_tunings() { local NUM_CPUS=$(nproc) local LRU_SIZE=$((100 * NUM_CPUS)) local params=( "ldlm.namespaces.*.lru_max_age=600000" "ldlm.namespaces.*.lru_size=$LRU_SIZE" "llite.*.max_cached_mb=64" "osc.*OST*.max_rpcs_in_flight=32" "mdc.*.max_rpcs_in_flight=64" "mdc.*.max_mod_rpcs_in_flight=50" ) for param in "${params[@]}"; do lctl set_param $param check_success "Set ${param%%=*}" done } verify_param() { local param=$1 local expected=$2 local actual=$3 if [ "$actual" == "$expected" ]; then echo "SUCCESS: $param is correctly set to $expected" else echo "WARNING: $param is set to $actual (expected $expected)" fi } verify_tunings() { local NUM_CPUS=$(nproc) local LRU_SIZE=$((100 * NUM_CPUS)) local params=( "ldlm.namespaces.*.lru_max_age:600000" "ldlm.namespaces.*.lru_size:$LRU_SIZE" "llite.*.max_cached_mb:64" "osc.*OST*.max_rpcs_in_flight:32" "mdc.*.max_rpcs_in_flight:64" "mdc.*.max_mod_rpcs_in_flight:50" ) echo "Verifying all parameters:" for param in "${params[@]}"; do name="${param%%:*}" expected="${param#*:}" actual=$(lctl get_param -n $name | head -1) verify_param "${name##*.}" "$expected" "$actual" done } setup_persistence() { # Create functions file cat << 'EOF' > /usr/local/bin/lustre_functions.sh #!/bin/bash apply_lustre_tunings() { local NUM_CPUS=$(nproc) local LRU_SIZE=$((100 * NUM_CPUS)) echo "Applying Lustre performance tunings..." lctl set_param ldlm.namespaces.*.lru_max_age=600000 lctl set_param ldlm.namespaces.*.lru_size=$LRU_SIZE lctl set_param llite.*.max_cached_mb=64 lctl set_param osc.*OST*.max_rpcs_in_flight=32 lctl set_param mdc.*.max_rpcs_in_flight=64 lctl set_param mdc.*.max_mod_rpcs_in_flight=50 } EOF # Create tuning script cat << 'EOF' > /usr/local/bin/apply_lustre_tunings.sh #!/bin/bash exec 1> >(logger -s -t $(basename $0)) 2>&1 # Source the functions source /usr/local/bin/lustre_functions.sh # FSx details FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted. MOUNT_NAME="<your-mount-name>" # Needs to be adjusted. MOUNT_POINT="</your/mount/point>" # Needs to be adjusted. # Function to check if Lustre is mounted is_lustre_mounted() { mount | grep -q "type lustre" } # Function to mount Lustre mount_lustre() { echo "Mounting Lustre filesystem..." mkdir -p ${MOUNT_POINT} mount -t lustre ${FSX_DNS}@tcp:/${MOUNT_NAME} ${MOUNT_POINT} return $? } # Main execution # Try to mount if not already mounted if ! is_lustre_mounted; then echo "Lustre filesystem not mounted, attempting to mount..." mount_lustre fi # Wait for successful mount (up to 5 minutes) for i in {1..30}; do if is_lustre_mounted; then echo "Lustre filesystem mounted, applying tunings..." apply_lustre_tunings exit 0 fi echo "Waiting for Lustre filesystem to be mounted... (attempt $i/30)" sleep 10 done echo "Timeout waiting for Lustre filesystem mount" exit 1 EOF # Create systemd service cat << 'EOF' > /etc/systemd/system/lustre-tunings.service [Unit] Description=Apply Lustre Performance Tunings After=network.target remote-fs.target StartLimitIntervalSec=0 [Service] Type=oneshot ExecStart=/usr/local/bin/apply_lustre_tunings.sh RemainAfterExit=yes Restart=on-failure RestartSec=30 [Install] WantedBy=multi-user.target EOF chmod +x /usr/local/bin/lustre_functions.sh chmod +x /usr/local/bin/apply_lustre_tunings.sh systemctl enable lustre-tunings.service systemctl start lustre-tunings.service } echo "Starting FSx for Lustre configuration..." # 1. Install Lustre client if grep -q 'VERSION="2"' /etc/os-release; then amazon-linux-extras install -y lustre elif grep -q 'VERSION="2023"' /etc/os-release; then dnf install -y lustre-client fi check_success "Install Lustre client" # 2. Apply network and RPC tunings export PATH=$PATH:/usr/sbin echo "Applying network and RPC tunings..." if ! grep -q "options ptlrpc ptlrpcd_per_cpt_max" /etc/modprobe.d/modprobe.conf; then echo "options ptlrpc ptlrpcd_per_cpt_max=64" | tee -a /etc/modprobe.d/modprobe.conf echo "options ksocklnd credits=2560" | tee -a /etc/modprobe.d/modprobe.conf fi # 3. Load Lustre modules modprobe lustre check_success "Load Lustre modules" || exit 1 # 4. Lustre Network Initialization lctl network up check_success "Initialize Lustre networking" || exit 1 # 5. Mount FSx filesystem FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted. MOUNT_NAME="<your-mount-name>" # Needs to be adjusted. MOUNT_POINT="</your/mount/point>" # Needs to be adjusted. if [ ! -z "$FSX_DNS" ] && [ ! -z "$MOUNT_NAME" ]; then mkdir -p $MOUNT_POINT mount -t lustre ${FSX_DNS}@tcp:/${MOUNT_NAME} ${MOUNT_POINT} check_success "Mount FSx filesystem" fi # 6. Apply tunings apply_tunings # 7. Verify tunings verify_tunings # 8. Setup persistence setup_persistence echo "FSx for Lustre configuration completed." --==MYBOUNDARY==--
  6. Wählen Sie beim Erstellen von Amazon-EKS-Knotengruppen diese Startvorlage aus. Weitere Informationen finden Sie unter Eine verwaltete Knotengruppe für Ihren Cluster erstellen.