Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Feb 2017 18:15:06 +0100
From:      Dirk-Willem van Gulik <dirkx@webweaving.org>
To:        "Kenneth D. Merry" <ken@FreeBSD.ORG>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: sa and mpt in FreeBSD 11.0-RELEASE-p2
Message-ID:  <9A1C3971-0614-4E7C-9A99-C40346D794CB@webweaving.org>
In-Reply-To: <20170220205621.GA14597@mithlond.kdm.org>
References:  <C2E846C2-D96B-4429-8DC9-5612EF529F3E@webweaving.org> <20170220205621.GA14597@mithlond.kdm.org>

next in thread | previous in thread | raw e-mail | index | archive | help

> On 20 Feb 2017, at 21:56, Kenneth D. Merry <ken@FreeBSD.ORG> wrote:
>=20
> On Mon, Feb 20, 2017 at 21:04:11 +0100, Dirk-Willem van Gulik wrote:
>> A machine, recently upgraded from 8.4 to FreeBSD 11.0-RELEASE-p2 =
seems to have lost pretty much any and all performance on mpt(4) with =
its attached tape drives
>>=20
>> Read performance is around 50Mbyte/second - and write a paltry =
100-200kbyte/second (and occasionally hitting 800kbyte/second) (from/to =
memory disk&/dev/null; no risk of shoe shining, compression off).
>>=20
>> SCSI bus looks happy; with no kernel messages. Output of the DLT =
script below.
>>=20
>> Normal LTO drives in a tape robot, G9 server; pretty much all SAS =
*except* for a U320 to tape drive with the performance issue. Active =
terminator.
>>=20
>> Does this ring a bell with anyone? Was anything changed in either the =
sa or mpt driver since 8.x ?=20
>>=20
>> One odd thing is that a 'dd(1)' -without- a block size (compression =
is off, data is a prepared urandom file on md disk) writes much faster =
-- while on 8.x one -had- to use a sane blockwise to get the 'normal' =
speed of around 120Mbyte/second. Could it be that one needs to fiddle =
with MAXPHYS (which AFAIK is a readonly sysctl).
>>=20
>=20
> What blocksize are you using?  What blocksize were you using before?  =
What
> application do you normally use to talk to the tape drive?

Amanda (or plain DD); we increased Amanda=E2=80=99s default of 32 to 64k =
(which stopped any and all shoe shining at that time. It was tested in =
2013 (so likely in FreeBSD 8) up to 16 Mbyte in factors of 2 according =
to our notes - but with no further improvements in performance - and =
left at 64k).

The actual drive (mt status -v) reports (prior to increasing MAXPHYS) on =
11.0-p2 with default kernel config:

> Drive: sa0: <QUANTUM ULTRIUM 4 W52T> Serial Number: HU1027B53Y
> ---------------------------------
> Mode      Density              Blocksize      bpi      Compression
> Current:  0x46:LTO-4           variable       323215   enabled (0x1)
> ---------------------------------
> Current Driver State: at rest.
> ---------------------------------
> Partition:   0      Calc File Number:   0     Calc Record Number: 0
> Residual:    0  Reported File Number:   0 Reported Record Number: 0
> Flags: BOP
> ---------------------------------
> Tape I/O parameters:
>   Maximum I/O size allowed by driver and controller (maxio): 131072 =
bytes
>   Maximum I/O size reported by controller (cpi_maxio): 131072 bytes
>   Maximum block size supported by tape drive and media (max_blk): =
16777215 bytes
>   Minimum block size supported by tape drive and media (min_blk): 1 =
bytes
>   Block granularity supported by tape drive and media (blk_gran): 0 =
bytes
>   Maximum possible I/O size (max_effective_iosize): 131072 bytes

=E2=80=A6.
> If you want to re-enable I/O splitting (which I should have disabled =
by
> now), you can set the following loader tunable in /boot/loader.conf:
>=20
> kern.cam.sa.allow_io_split=3D1

Ok - this changes behaviour - non-blocksized limited writes are now up; =
2Mbyte/second; any block-sized write is 200kb/second (regardless of bs).

> If so, you probably want to look at the blocksize you're using, and =
bump up
> MAXPHYS in your kernel configuration to a larger value.

Post MAXPHYS & DFLTPHYS increase to 4MB (4x1024x1024) (as 16MB caused =
the kernel to hang during boot just post usb/knd - likely as it is there =
that it starts on SAS disk & tape discovery) I get
as =E2=80=98mt status -v=E2=80=99 the output:

> Tape I/O parameters:
>   Maximum I/O size allowed by driver and controller (maxio): 1372160 =
bytes
>   Maximum I/O size reported by controller (cpi_maxio): 1372160 bytes
>   Maximum block size supported by tape drive and media (max_blk): =
16777215 bytes
>   Minimum block size supported by tape drive and media (min_blk): 1 =
bytes
>   Block granularity supported by tape drive and media (blk_gran): 0 =
bytes
>   Maximum possible I/O size (max_effective_iosize): 1372160 bytes


And see the same speeds; non blocksize limited (with dd) are =
2.7Mbyte/second (so slightly higher); the blocksized writes are better =
(but still) low; 200kbyte/second for 16k, 600k for 32k, 800k for 64k, =
500k for 128k, 1M at 256k, 1M at 1024k. The writes at 2048k and 4096k =
fail with a =E2=80=98hardware failure asc:44,0 =E2=80=94 tape is now =
frozen=E2=80=9D error).

This is with `kern.cam.sa.allow_io_split=3D1=E2=80=99 in =
/boot/loader.conf=E2=80=99. Doing so without that (after a reboot) give =
substantially similar results: (1.8Mbyte/second (0), 450k (16k), 560k =
(32k), 0.9M (64), 560k (128k), 730k (256k) and 600k (1M) =E2=80=94 it =
fairly errors out with a si_iosize_max=3D1372160 for sizes above that.

Dw

#!/bin/sh
set -x

# create a ram disk of about 1 Gbyte with a noncompressible file on it.
#
mdconfig -a -s 1200M
newfs md0
mount /dev/md0 /mnt
dd if=3D/dev/urandom bs=3D1m count=3D1024 of=3D/mnt/test-1024m

for i in "" bs=3D16k bs=3D32k bs=3D64k bs=3D128k bs=3D256k bs=3D1024k =
bs=3D2048k bs=3D4196k
do
	mt rewind
	echo Run started with  ${i:-no blocksize set}
	dd if=3D/mnt/test-1024m $i of=3D/dev/nsa0
done



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9A1C3971-0614-4E7C-9A99-C40346D794CB>