Best practices voor gelijktijdigheid van Linux voor Azure NetApp Files - Sessiesites en vermeldingen in sitetabellen

Dit artikel helpt u inzicht te hebben in best practices voor gelijktijdigheid voor sessiesites en sitetabelvermeldingen van het Azure NetApp Files NFS-protocol.

NFSv3

NFSv3 heeft geen mechanisme om te onderhandelen over gelijktijdigheid tussen de client en de server. De client en de server definiëren de limiet ervan zonder de andere te raadplegen. Voor de beste prestaties moet u het maximum aantal vermeldingen in de sitetabel aan de clientzijde sunrpc afstemmen met die worden ondersteund zonder pushback op de server. Wanneer een client de mogelijkheid van de servernetwerkstack om een workload te verwerken overweldigt, reageert de server door de venstergrootte voor de verbinding te verlagen. Dit is geen ideaal prestatiescenario.

Standaard definiëren moderne Linux-kernels de invoergrootte sunrpc.tcp_max_slot_table_entries per verbindingssitetabel sunrpc als ondersteuning voor 65.536 openstaande bewerkingen, zoals wordt weergegeven in de volgende tabel.

Azure NetApp Files NFSv3-server
Maximale uitvoeringscontexten per verbinding
Linux-client
Standaard maximum sunrpc aantal items in sitetabellen per verbinding
128 65.536

Deze sitetabelvermeldingen definiëren de limieten voor gelijktijdigheid. Waarden die dit hoog zijn, zijn niet nodig. Als u bijvoorbeeld een wachtrijtheorie gebruikt die Littles Law wordt genoemd, zult u merken dat de I/O-snelheid wordt bepaald door gelijktijdigheid (dat wil zeggen openstaande I/O) en latentie. Als zodanig bewijst het algoritme dat 65.536 sleuven een hogere orde hebben dan wat nodig is om zelfs zeer veeleisende workloads te stimuleren.

Littles Law: (concurrency = operation rate × latency in seconds)

Een gelijktijdigheidsniveau van maximaal 155 is voldoende om 155.000 Oracle DB NFS-bewerkingen per seconde te bereiken met oracle Direct NFS, wat een technologie is die vergelijkbaar is met de nconnect koppeloptie:

  • Gezien een latentie van 0,5 ms is een gelijktijdigheid van 55 nodig om 110.000 IOPS te bereiken.
  • Gezien een latentie van 1 ms is een gelijktijdigheid van 155 nodig om 155.000 IOPS te bereiken.

Oracle DNFS latency curve

Zie de prestaties van Oracle-databases in enkele volumes van Azure NetApp Files voor meer informatie.

De sunrpc.tcp_max_slot_table_entries kan geen afstemmingsparameter op verbindingsniveau zijn. Als best practice stelt u deze waarde in op 128 of minder per verbinding en overschrijdt u de omgeving van 10.000 sleuven niet.

Voorbeelden van aantal sleufen op basis van aanbeveling voor gelijktijdigheid

Voorbeelden in deze sectie laten het aantal site's zien op basis van de aanbeveling voor gelijktijdigheid.

Voorbeeld 1: één NFS-client, 65.536 sunrpc.tcp_max_slot_table_entriesen nee nconnect voor een maximale gelijktijdigheid van 128 op basis van de limiet aan de serverzijde van 128

Voorbeeld 1 is gebaseerd op één clientworkload met de standaardwaarde sunrpc.tcp_max_slot_table_entry 65.536 en één netwerkverbinding, dus nee nconnect. In dit geval is een gelijktijdigheid van 128 haalbaar.

  • NFS_Server=10.10.10.10, NFS_Client=10.10.10.11
    • Connection (10.10.10.10:2049, 10.10.10.11:6543,TCP)
      • De client kan in theorie niet meer dan 65.536 aanvragen verzenden naar de server per verbinding.
      • De server accepteert niet meer dan 128 aanvragen tijdens de vlucht vanaf deze enkele verbinding.

Voorbeeld 2: één NFS-client, 128 sunrpc.tcp_max_slot_table_entriesen nee nconnect voor een maximale gelijktijdigheid van 128

Voorbeeld 2 is gebaseerd op één clientworkload met een sunrpc.tcp_max_slot_table_entry waarde van 128, maar zonder de koppelingsoptie nconnect . Met deze instelling is een gelijktijdigheid van 128 mogelijk vanaf één netwerkverbinding.

  • NFS_Server=10.10.10.10, NFS_Client=10.10.10.11
    • Connection (10.10.10.10:2049, 10.10.10.11:6543,TCP)
      • De client zal niet meer dan 128 aanvragen verzenden tijdens de vlucht naar de server per verbinding.
      • De server accepteert niet meer dan 128 aanvragen tijdens de vlucht vanaf deze enkele verbinding.

Voorbeeld 3: één NFS-client, 100 sunrpc.tcp_max_slot_table_entriesen nconnect=8 voor een maximale gelijktijdigheid van 800

Voorbeeld 3 is gebaseerd op één clientworkload, maar met een lagere sunrpc.tcp_max_slot_table_entry waarde van 100. Deze keer is de nconnect=8 koppelingsoptie gebruikt voor het spreiden van de workload over 8 verbindingen. Met deze instelling is een gelijktijdigheid van 800 haalbaar over de 8 verbindingen. Dit bedrag is de gelijktijdigheid die nodig is om 400.000 IOPS te bereiken.

  • NFS_Server=10.10.10.10, NFS_Client=10.10.10.11
    • Connection 1 (10.10.10.10:2049, 10.10.10.11:6543,TCP), Connection 2 (10.10.10.10:2049, 10.10.10.11:6454,TCP)… Connection 8 (10.10.10.10:2049, 10.10.10.11:7321,TCP)
    • Verbinding maken ion 1
      • De client zal niet meer dan 100 aanvragen uitgeven tijdens de vlucht naar de server vanaf deze verbinding.
      • De server accepteert naar verwachting niet meer dan 128 aanvragen tijdens de vlucht van de client voor deze verbinding.
    • Verbinding maken ion 2
      • De client zal niet meer dan 100 aanvragen uitgeven tijdens de vlucht naar de server vanaf deze verbinding.
      • De server accepteert naar verwachting niet meer dan 128 aanvragen tijdens de vlucht van de client voor deze verbinding.
    • Verbinding maken ion 8
      • De client zal niet meer dan 100 aanvragen uitgeven tijdens de vlucht naar de server vanaf deze verbinding.
      • De server accepteert naar verwachting niet meer dan 128 aanvragen tijdens de vlucht van de client voor deze verbinding.

Voorbeeld 4 – 250 NFS-clients, 8 sunrpc.tcp_max_slot_table_entriesen nee nconnect voor een maximale gelijktijdigheid van 2000

Voorbeeld 4 gebruikt de gereduceerde waarde per client sunrpc.tcp_max_slot_table_entry van 8 voor een EDA-omgeving met 250 machines. In dit scenario wordt een gelijktijdigheid van 2000 omgeving bereikt, een waarde die meer dan voldoende is om 4000 MiB/s van een back-end-EDA-workload te stimuleren.

  • NFS_Server=10.10.10.10, NFS_Client1=10.10.10.11
    • Connection (10.10.10.10:2049, 10.10.10.11:6543,TCP)
      • De client geeft niet meer dan 8 aanvragen tijdens de vlucht naar de server per verbinding uit.
      • De server accepteert niet meer dan 128 aanvragen tijdens de vlucht vanaf deze enkele verbinding.
  • NFS_Server=10.10.10.10, NFS_Client2=10.10.10.12
    • Connection (10.10.10.10:2049, 10.10.10.12:7820,TCP)
      • De client geeft niet meer dan 8 aanvragen tijdens de vlucht naar de server per verbinding uit.
      • De server accepteert niet meer dan 128 aanvragen tijdens de vlucht vanaf deze enkele verbinding.
  • NFS_Server=10.10.10.10, NFS_Client250=10.10.11.13
    • Connection (10.10.10.10:2049, 10.10.11.13:4320,TCP)
      • De client geeft niet meer dan 8 aanvragen tijdens de vlucht naar de server per verbinding uit.
      • De server accepteert niet meer dan 128 aanvragen tijdens de vlucht vanaf deze enkele verbinding.

Wanneer u NFSv3 gebruikt, moet u het aantal opslageindpunten gezamenlijk op 10.000 of minder houden. U kunt het beste de waarde per verbinding instellen voor sunrpc.tcp_max_slot_table_entries minder dan 128 wanneer een toepassing wordt uitgeschaald over veel netwerkverbindingen (nconnect en HPC in het algemeen en EDA in het bijzonder).

Het beste berekenen sunrpc.tcp_max_slot_table_entries

Met Littles Law kunt u het totale aantal vereiste sitetabelvermeldingen berekenen. Houd in het algemeen rekening met de volgende factoren:

  • Workloads uitschalen zijn vaak dominant groot sequentiële aard.
  • Databaseworkloads, met name OLTP, zijn vaak willekeurig van aard.

In de volgende tabel ziet u een voorbeeldstudie van gelijktijdigheid met willekeurige latenties die zijn opgegeven:

I/O-grootte Latentie I/O of doorvoer Gelijktijdigheid
8 KiB 0,5 ms 110.000 IOPS | 859 MiB/s 55
8 KiB 2 ms 400.000 IOPS | 3.125 MiB/s 800
256 KiB 2 ms 16.000 IOPS | 4000 MiB/s 32
256 KiB 4 ms 32.000 IOPS | 8.000 MiB/s 128

Gelijktijdigheidsinstellingen berekenen op aantal verbindingen

Als de werkbelasting bijvoorbeeld een EDA-farm is en 1.250 clients alle werkbelasting naar hetzelfde opslageindpunt (een opslageindpunt is een IP-adres voor opslag), berekent u de vereiste I/O-snelheid en verdeelt u de gelijktijdigheid over de farm.

Stel dat de workload 4000 MiB/s is met een gemiddelde bewerkingsgrootte van 256-KiB en een gemiddelde latentie van 10 ms. Gebruik de volgende formule om gelijktijdigheid te berekenen:

(concurrency = operation rate × latency in seconds)

De berekening wordt omgezet in een gelijktijdigheid van 160:

(160 = 16,000 × 0.010)

Gezien de behoefte aan 1.250 clients, kunt u veilig instellen sunrpc.tcp_max_slot_table_entries op 2 per client om de 4000 MiB/s te bereiken. U kunt echter besluiten om extra ruimte in te bouwen door het aantal per client in te stellen op 4 of zelfs 8, waardoor het 10.000 aanbevolen slot plafond goed blijft.

Instellen sunrpc.tcp_max_slot_table_entries op de client

  1. Toevoegen sunrpc.tcp_max_slot_table_entries=<n> aan het /etc/sysctl.conf configuratiebestand.
    Als tijdens het afstemmen een waarde lager dan 128 wordt gevonden, vervangt u 128 door het juiste getal.
  2. Voer de volgende opdracht uit:
    $ sysctl -p
  3. Koppel alle NFS-bestandssystemen (of koppel deze opnieuw), omdat het niet mogelijk is alleen van toepassing op koppelingen die zijn gemaakt nadat de NFS-bestand niet is ingesteld.

NFSv4.1

In NFSv4.1 definiëren sessies de relatie tussen de client en de server. Of de gekoppelde NFS-bestandssystemen boven op één verbinding of veel (zoals het geval nconnectis), de regels voor de sessie van toepassing zijn. Bij het instellen van de sessie onderhandelt de client en de server over het maximum aantal aanvragen voor de sessie, met de lagere van de twee ondersteunde waarden. Azure NetApp Files ondersteunt 180 openstaande aanvragen en Linux-clients zijn standaard ingesteld op 64. In de volgende tabel ziet u de sessielimieten:

Azure NetApp Files NFSv4.1-server
Maximum aantal opdrachten per sessie
Linux-client
Standaard maximum aantal opdrachten per sessie
Onderhandelde maximumopdrachten voor de sessie
180 64 64

Hoewel Linux-clients standaard 64 maximumaanvragen per sessie hebben, kan de waarde niet max_session_slots worden uitgevoerd. Opnieuw opstarten is vereist om wijzigingen van kracht te laten worden. Gebruik de systool -v -m nfs opdracht om het huidige maximum te zien dat door de client wordt gebruikt. De opdracht werkt alleen als er ten minste één NFSv4.1-koppeling aanwezig is:

$ systool -v -m nfs
{
Module = "nfs"
...
  Parameters:
...
    max_session_slots   = "64"
...
}

Als u wilt afstemmen max_session_slots, maakt u een configuratiebestand onder /etc/modprobe.d als zodanig. Zorg ervoor dat er geen aanhalingstekens aanwezig zijn voor de regel in het bestand. Anders wordt de optie niet van kracht.

$ sudo echo “options nfs max_session_slots=180” > /etc/modprobe.d/nfsclient.conf $ sudo reboot

Azure NetApp Files beperkt elke sessie tot maximaal 180 opdrachten. Overweeg daarom 180 de maximumwaarde die momenteel kan worden geconfigureerd. De client kan geen gelijktijdigheid bereiken die groter is dan 128, tenzij de sessie is verdeeld over meer dan één verbinding, omdat Azure NetApp Files elke verbinding beperkt tot maximaal 128 maximaal NFS-opdrachten. Als u meer dan één verbinding wilt, wordt de nconnect koppelingsoptie aanbevolen en is een waarde van twee of meer vereist.

Voorbeelden van verwachte gelijktijdigheidslimieten

In deze sectie ziet u de verwachte gelijktijdigheidslimieten.

Voorbeeld 1 – 64 max_session_slots en nee nconnect

Voorbeeld 1 is gebaseerd op de standaardinstelling van 64 max_session_slots en nee nconnect. Met deze instelling is een gelijktijdigheid van 64 mogelijk, allemaal vanuit één netwerkverbinding.

  • NFS_Server=10.10.10.10, NFS_Client=10.10.10.11
    • Connection (10.10.10.10:2049, 10.10.10.11:6543,TCP)
      • De client zal niet meer dan 64 aanvragen uitgeven tijdens de vlucht naar de server voor de sessie.
      • De server accepteert niet meer dan 64 aanvragen tijdens de vlucht van de client voor de sessie. (64 is de onderhandelde waarde.)

Voorbeeld 2 – 64 max_session_slots en nconnect=2

Voorbeeld 2 is gebaseerd op maximaal 64 session_slots , maar met de toegevoegde koppeloptie van nconnect=2. Een gelijktijdigheid van 64 is haalbaar, maar verdeeld over twee verbindingen. Hoewel meerdere verbindingen in dit scenario geen grotere gelijktijdigheid opleveren, heeft de verminderde wachtrijdiepte per verbinding een positieve invloed op de latentie.

Met de max_session_slots nog steeds op 64 maar nconnect=2, ziet u dat het maximum aantal aanvragen wordt verdeeld over de verbindingen.

  • NFS_Server=10.10.10.10, NFS_Client=10.10.10.11
    • Connection 1 (10.10.10.10:2049, 10.10.10.11:6543,TCP) && Connection 2 (10.10.10.10:2049, 10.10.10.11:6454,TCP)
    • Verbinding maken ion 1
      • De client zal niet meer dan 32 aanvragen verzenden tijdens de vlucht naar de server vanaf deze verbinding.
      • De server accepteert naar verwachting niet meer dan 32 aanvragen tijdens de vlucht van de client voor deze verbinding.
    • Verbinding maken ion 2
      • De client zal niet meer dan 32 aanvragen verzenden tijdens de vlucht naar de server vanaf deze verbinding.
      • De server accepteert naar verwachting niet meer dan 32 aanvragen tijdens de vlucht van de client voor deze verbinding.

Voorbeeld 3 – 180 max_session_slots en nee nconnect

In voorbeeld 3 wordt de nconnect koppeloptie verwijderd en wordt de max_session_slots waarde ingesteld op 180, die overeenkomt met de maximale gelijktijdigheid van NFSv4.1 van de server. In dit scenario, met slechts één verbinding en gezien de Maximale openstaande bewerking van Azure NetApp Files 128 per NFS-verbinding, is de sessie beperkt tot 128 bewerkingen tijdens de vlucht.

Hoewel max_session_slots deze is ingesteld op 180, is de enkele netwerkverbinding beperkt tot maximaal 128 aanvragen als volgt:

  • NFS_Server=10.10.10.10, NFS_Client=10.10.10.11
    • Connection (10.10.10.10:2049, 10.10.10.11:6543,TCP)
      • De client zal niet meer dan 180 aanvragen uitgeven tijdens de vlucht naar de server voor de sessie.
      • De server accepteert niet meer dan 180 aanvragen tijdens de vlucht van de client voor de sessie.
      • De server accepteert niet meer dan 128 aanvragen tijdens de vlucht voor de enkele verbinding.

Voorbeeld 4 – 180 max_session_slots en nconnect=2

In voorbeeld 4 wordt de nconnect=2 koppelingsoptie toegevoegd en wordt de waarde 180 max_session_slots opnieuw gebruikt. Omdat de totale workload is verdeeld over twee verbindingen, zijn er 180 openstaande bewerkingen mogelijk.

Met twee verbindingen die worden afgespeeld, ondersteunt de sessie de volledige toewijzing van 180 openstaande aanvragen.

  • NFS_Server=10.10.10.10, NFS_Client=10.10.10.11
    • Connection 1 (10.10.10.10:2049, 10.10.10.11:6543,TCP) && Connection 2 (10.10.10.10:2049, 10.10.10.11:6454,TCP)
    • Verbinding maken ion 1
      • De client onderhoudt naar verwachting niet meer dan 90 aanvragen tijdens de vlucht naar de server vanaf de verbinding.
      • De server zal naar verwachting niet meer dan 90 aanvragen tijdens de vlucht van de client onderhouden voor deze verbinding binnen de sessie.
    • Verbinding maken ion 2
      • De client onderhoudt naar verwachting niet meer dan 90 aanvragen tijdens de vlucht naar de server vanaf de verbinding.
      • De server zal naar verwachting niet meer dan 90 aanvragen tijdens de vlucht van de client onderhouden voor deze verbinding binnen de sessie.

Notitie

Stel voor maximale gelijktijdigheid max_session_slots gelijk aan 180 in. Dit is de maximale gelijktijdigheid op sessieniveau die momenteel wordt ondersteund door Azure NetApp Files.

Controleren op de maximaal openstaande aanvragen voor de sessie

Als u de session_slot grootten wilt zien die door de client en server worden ondersteund, legt u de koppelingsopdracht vast in een pakkettracering. Zoek naar het CREATE_SESSION gesprek en CREATE_SESSION antwoord, zoals wordt weergegeven in het volgende voorbeeld. De aanroep is afkomstig van de client en het antwoord is afkomstig van de server.

Gebruik de volgende tcpdump opdracht om de koppelingsopdracht vast te leggen:

$ tcpdump -i eth0 -s 900 -w /tmp/write.trc port 2049

Met Wireshark zijn de interessante pakketten als volgt:

Screenshot that shows packets of interest.

Bekijk binnen deze twee pakketten het max_reqs veld in de middelste sectie van het traceringsbestand.

  • Network File System
    • Operations
      • Opcode
        • csa_fore_channel_attrs
        • max reqs

Pakket 12 (maximaal clientaanvragen) geeft aan dat de client een max_session_slots waarde van 64 had. In de volgende sectie ziet u dat de server ondersteuning biedt voor gelijktijdigheid van 180 voor de sessie. De sessie onderhandelt uiteindelijk over de lagere van de twee opgegeven waarden.

Screenshot that shows max session slots for Packet 12.

In het volgende voorbeeld ziet u Pakket 14 (maximaal serveraanvragen):

Screenshot that shows max session slots for Packet 14.

Volgende stappen