Unable to split non-READ/WRITE cmds. (opcode 0x3c)

When user issue ./symcfg discover from solution enabler it sends 0x3c and 0x3b commands to the Symm and VMAX. The behaviour remains same even solution enabler software is installed on the VM hosted on ESXi host.

Some times we see 0x3c/0x3b commands getting failed with following messages on ESXi host:

T01:16:33.793Z cpu22:36922)WARNING: ScsiPath: 2360: vmhba0:C0:T8:L6: Unable to split non-READ/WRITE cmds. (opcode 0x3c) 

T01:16:33.793Z cpu22:32827)NMP: nmp_ThrottleLogForDevice:2458: Cmd 0x3c (0x413640411e80, 36914) to dev "naa.60000970000297700013533030303738" on path "vmhba0:C0:T8:L6" Failed: H:0x0 D:0x2 P:0x0 Valid sense data: 0x5 0x24 0x0. Act:NONE

Scsi command 0x3c is Read Buffers. The default payload for the command ./symcfg discover is 63KB.

ESXi host can not split any commands other than READ/WRITE (READ or WRITE 6/10/12/16) commands. 0x3c is neither read nor write. Hence vmkernel logs show:

Unable to split non-READ/WRITE cmds. (opcode 0x3c)

Why there is a requirement to split the command?

On ESXi host, VM IO size is controlled with “DiskMaxIOSize” parameter. The default value for the parameter is 32MB. Commands with more than 32MB IO size will get split automatically.

The current value of the parameter can be verified from the command :

# esxcli system settings advanced list
 Path: /Disk/DiskMaxIOSize
 Type: integer
 Int Value: 16
 Default Int Value: 32767
 Min Value: 32
 Max Value: 32767
 String Value:
 Default String Value:
 Valid Characters:
 Description: Max Disk READ/WRITE I/O size before splitting (in KB)

From the output, we can see that the Maximum IO size is set to 16KB when payload for 0x3c was 63KB. Therefore VM IO split request was sent.

Setting the maximum IO size of more than 63KB will fix the issue. Here is how we can set the value for the parameter:

# esxcli system settings advanced set -i 128 -o /Disk/DiskMaxIOSize

With the above command, the value set to 128KB, which is more than 0x3c command payload.

# esxcli system settings advanced set -d -o /Disk/DiskMaxIOSize

This command will help in setting the default value for the parameter.

Verifying the current value by running:

# esxcli system settings advanced list
 Path: /Disk/DiskMaxIOSize
 Type: integer
 Int Value: 128
 Default Int Value: 32767
 Min Value: 32
 Max Value: 32767
 String Value:
 Default String Value:
 Valid Characters:
 Description: Max Disk READ/WRITE I/O size before splitting (in KB)Ref: https://suppotrt.emc.com/kb/514555

Leave a comment