Delen via


Best practices voor Linux-gelijktijdigheid voor Azure NetApp Files - Sessiesloten en invoer in sleuteltabellen

Dit artikel helpt u de best practices voor gelijktijdigheid voor sessieslots en slottabelitems van het Azure NetApp Files NFS-protocol te begrijpen.

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 maximale aantal client-side slottafelvermeldingen sunrpc afstemmen op wat wordt ondersteund zonder problemen 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 per verbindingsslot-tabel sunrpc.tcp_max_slot_table_entries als ondersteunend voor 65.536 openstaande bewerkingen, zoals 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 slot tabel vermeldingen definiëren de beperkingen voor gelijktijdige uitvoering. 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 toont het algoritme aan dat 65.536 sleuven ordes van grootte hoger zijn dan wat nodig is om zelfs de meest veeleisende workloads aan te drijven.

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 I/OPS te bereiken.
  • Gezien een latentie van 1 ms is een gelijktijdigheid van 155 nodig om 155.000 I/OPS te bereiken.

Oracle DNFS-latentiecurve

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

De sunrpc.tcp_max_slot_table_entries is een afstemmingsparameter op verbindingsniveau. Als beste praktijk stelt u deze waarde per verbinding in op 128 of minder, en zorg ervoor dat u het totale aantal sleuven in de omgeving niet boven 10.000 laat uitkomen.

Voorbeelden van aantal slots op basis van aanbeveling voor concurrentievermogen

Voorbeelden in deze sectie demonstreren de slotaantallen op grond 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 I/OPS 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 1
      • De client geeft niet meer dan 100 aanvragen 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 2
      • De client geeft niet meer dan 100 aanvragen 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 8
      • De client geeft niet meer dan 100 aanvragen 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 omgevingsbreed een gelijktijdigheid van 2000 bereikt, een waarde die meer dan voldoende is om 4000 MiB/s van een backend EDA-workload te verwerken.

  • 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 acht 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 acht 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 acht 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. Het is raadzaam om de waarde per verbinding in te stellen op 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).

Hoe je het beste kunt berekenen sunrpc.tcp_max_slot_table_entries

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

  • Scale-out workloads zijn vaak grotendeels groot en sequentieel van aard.
  • Databaseworkloads, met name verwerking van onlinetransacties, 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 I/OPS | 859 MiB/s 55
8 KiB 2 ms 400.000 I/OPS | 3.125 MiB/s Achthonderd
256 KiB 2 ms 16.000 I/OPS | 4000 MiB/s 32
256 KiB 4 ms 32.000 I/OPS | 8.000 MiB/s 128

Instellingen voor gelijktijdigheid berekenen op basis van het aantal verbindingen

Als de werkbelasting bijvoorbeeld een EDA-farm is en 1.250 clients alle werkbelasting naar hetzelfde opslageindpunt sturen (een opslageindpunt is een opslag-IP-adres), berekent u het benodigde I/O-tarief en verdeelt u de concurrentie 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 clients in te stellen op 4 of zelfs 8, zodat u ruim onder de aanbevolen slotlimiet van 10.000 blijft.

Hoe sunrpc.tcp_max_slot_table_entries instellen 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), aangezien de instelbare parameter alleen van toepassing is op koppelingen die zijn gemaakt nadat de parameter is ingesteld.

NFSv4.1

In NFSv4.1 definiëren sessies de relatie tussen de client en de server. Of de gekoppelde NFS-bestandssystemen zich bovenop één verbinding of meerdere bevinden (zoals het geval is met nconnect), zijn de regels voor de sessie van toepassing. Bij het instellen van de sessie onderhandelen de client en de server over het maximumaantal verzoeken voor de sessie, waarbij de lagere van de twee ondersteunde waarden wordt gekozen. 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 een maximum van 64 aanvragen per sessie hebben, is de waarde van max_session_slots aanpasbaar. 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 gelijktijdigheidsmaxima

In deze sectie worden voorbeelden gegeven van de verwachte maximumwaarden voor gelijktijdigheid.

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 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 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 het maximum van 128 openstaande bewerkingen van Azure NetApp Files per NFS-verbinding, is de sessie beperkt tot 128 bewerkingen in uitvoering.

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 over twee verbindingen is verdeeld, zijn 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 1
      • De klant wordt geacht niet meer dan 90 verzoeken in behandeling te hebben naar de server vanaf verbinding één.
      • Van de server wordt verwacht dat hij niet meer dan 90 gelijktijdige aanvragen van de client voor deze verbinding binnen de sessie verwerkt.
    • Verbinding 2
      • De klant wordt geacht niet meer dan 90 verzoeken in behandeling te hebben naar de server vanaf verbinding één.
      • Van de server wordt verwacht dat hij niet meer dan 90 gelijktijdige aanvragen van de client voor deze verbinding binnen de sessie verwerkt.

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.

Hoe te controleren voor de maximale openstaande verzoeken 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 de CREATE_SESSION oproep en CREATE_SESSION reactie zoals in het onderstaande 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:

Schermopname van interessante pakketten.

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

  • Netwerkbestandssysteem
    • Bedrijfsvoering
      • 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.

Schermopname van de maximale sessiesites voor Pakket 12.

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

Schermopname van het maximum aantal sessiesites voor Pakket 14.

Volgende stappen