kernel: mps0: Out of chain frames, consider increasing hw.mps.max_chains.

Slawa Olhovchenkov slw at
Mon Mar 7 06:04:14 UTC 2016

On Sun, Mar 06, 2016 at 06:20:06PM -0800, Scott Long wrote:

> > On Mar 6, 2016, at 1:27 PM, Slawa Olhovchenkov <slw at> wrote:
> > 
> > On Sun, Mar 06, 2016 at 01:10:42PM -0800, Scott Long wrote:
> > 
> >> Hi,
> >> 
> >> The message is harmless, it's a reminder that you should tune the kernel for your workload.  When the message is triggered, it means that a potential command was deferred, likely for only a few microseconds, and then everything moved on as normal.  
> >> 
> >> A command uses anywhere from 0 to a few dozen chain frames per I/o, depending on the size of the io.  The chain frame memory is allocated at boot so that it's always available, not allocated on the fly.  When I wrote this driver, I felt that it would be wasteful to reserve memory for a worst case scenario of all large io's by default, so I put in this deferral system with a console reminder to for tuning.  
> >> 
> >> Yes, you actually do have 900 io's outstanding.  The controller buffers the io requests and allows the system to queue up much more than what sata disks might allow on their own.  It's debatable if this is good or bad, but it's tunable as well.
> >> 
> >> Anyways, the messages should not cause alarm.  Either tune up the chain frame count, or tune down the max io count.
> > 
> > I am don't know depends or not, but I see dramaticaly performance drop
> > at time of this messages.
> > 
> Good to know.  Part of the performance drop might be because of the slowness of printing to the console.

no, on console print may be one per minute

> > How I can calculate buffers numbers?
> If your system is new enough to have mpsutil, please run it ‘mpsutil
> show iocfacts’.

As I see mpsutil present only on -HEAD.
Can I compile it on 10-STABLE?

> If not, then boot your system with bootverbose and send me the output.

I can do this day ago.

> > I am have very heavy I/O.
> Out of curiosity, do you redefine MAXPHYS/DFLTPHYS in your kernel config?


> > This allocated one for all controllers, or allocated for every controller?
> It’s per-controller.
> I’ve thought about making the tuning be dynamic at runtime.  I
> implemented similar dynamic tuning for other drivers, but it seemed
> overly complex for low benefit.  Implementing it for this driver
> would be possible but require some significant code changes.

What cause of chain_free+io_cmds_active << max_chains?
One cmd can use many chains?

More information about the freebsd-stable mailing list