SolidFire vs DelayedAck

Pour faire suite au précèdent billet SolidFire vs Heartbeat ATS sur les soucis que nous avons eu avec des baies SolidFire, nous avons du désactiver un autre paramètre: DelayedAck

Pour faire simple, ce paramètre indique que le destinataire d’une trame TCP met en attente l’envoi de trame d’accusé de réception (ACK) afin de pouvoir grouper l’envoi de ces trames et ainsi diminuer la charge réseau nécessaire (dans le principe c’est plutôt une bonne chose ^^).

snake

La KB1002598 de VMware détaille aussi ce principe:

A central precept of the TCP network protocol is that data sent through TCP be acknowledged by the recipient. According to RFC 813, « Very simply, when data arrives at the recipient, the protocol requires that it send back an acknowledgement of this data. The protocol specifies that the bytes of data are sequentially numbered, so that the recipient can acknowledge data by naming the highest numbered byte of data it has received, which also acknowledges the previous bytes. ». The TCP packet that carries the acknowledgement is known as an ACK.

A host receiving a stream of TCP data segments can increase efficiency in both the network and the hosts by sending less than one ACK acknowledgment segment per data segment received. This is known as a delayed ACK. The common practice is to send an ACK for every other full-sized data segment and not to delay the ACK for a segment by more than a specified threshold. This threshold varies between 100ms and 500ms. ESXi/ESX uses delayed ACK because of its benefits, as do most other servers.

Le problème est que certaines baies iSCSI attendent de recevoir un segment ACK pour envoyer la trame suivante, ce qui peut amener à des timeout récurrents (c’est facilement visible en faisant une capture Wireshark par exemple), et donc une perte globale de performance.

The affected iSCSI arrays in question take a slightly different approach to handling congestion. Instead of implementing either the slow start algorithm or congestion avoidance algorithm, or both, these arrays take the very conservative approach of retransmitting only one lost data segment at a time and waiting for the host’s ACK before retransmitting the next one. This process continues until all lost data segments have been recovered.

Un point important de l’impact du DelayedAck par rapport au heartbeat VMFS se trouve un peu plus loin dans la KB:

Most notably, the VMFS heartbeat experiences a large volume of timeouts because VMFS uses a short timeout value

Par rapport au fonctionnement de la baie, le support de SolidFire nous a donc demandé de désactiver ce paramètre. Cela peut se modifier a tout niveau de la chaine iSCSI, c’est à dire au niveau de l’adapter, de la target et/ou des devices avec un principe d’héritage de la valeur (pratique pour appliquer ce paramètre de manière globale). Dans notre cas, comme le support de SolidFire demandait de le désactiver définitivement, nous l’avons donc fait directement au niveau de l’adapter:

Advanced_Settings_2015-07-28_17-43-05

Configuration ESXi > Storage Adapters > iSCSI Adapter > Properties > General Tab > Advanced

Afin de pouvoir afficher rapidement l’état de cette valeur sur toute une plateforme, nous avons fait un petit OneLiner rapide:

Get-View -ViewType HostSystem -Property Name, Config.StorageDevice.HostBusAdapter | Select Name, @{Name="DelayedAck"; Expression={($_.Config.StorageDevice.HostBusAdapter.AdvancedOptions | ?{$_.key -eq "DelayedAck"}).value}}

Ensuite, afin de pouvoir désactiver ce paramètre sur toute la plateforme, nous avons fait un autre OneLiner (vous pouvez le relancer autant de fois que vous voulez, il y a une vérification effectuée pour ne changer la valeur que si c’est nécessaire):

Get-View -ViewType HostSystem -Property Config.StorageDevice.HostBusAdapter, ConfigManager.StorageSystem -SearchRoot (Get-View -ViewType ClusterComputeResource -Filter @{"Name" = "nom du cluster a mettre a jour"}).MoRef | ?{ ($_.Config.StorageDevice.HostBusAdapter.AdvancedOptions | ?{$_.key -eq "DelayedAck"}).value} | %{ (Get-View ($_.ConfigManager.StorageSystem) ).UpdateInternetScsiAdvancedOptions( ($_.config.storagedevice.HostBusAdapter | ?{$_.Model -match "iSCSI Software"}).device, $null, (New-Object VMware.Vim.HostInternetScsiHbaParamValue -Property @{Key = "DelayedAck"; Value = $false}))}

One comment

Laisser un commentaire

Required fields are marked *.