parent
da632d90c5
commit
0bc2476033
161
ConcurrentLinuxSr.md
Normal file
161
ConcurrentLinuxSr.md
Normal file
@ -0,0 +1,161 @@
|
||||
# The problems with concurrent burns on Linux
|
||||
|
||||
Beginning with high version numbers of Linux kernel 2.6 and up to
|
||||
at least kernel 4.3.0 there is a performance problem when more than
|
||||
one optical drive is used for burning or reading via libburn at the same time.
|
||||
The overall throughput is less than the throughput of the slowest drive
|
||||
when it is used as only one.
|
||||
|
||||
This affects SATA and USB attached drives alike. Most probably also IDE
|
||||
attached ones.
|
||||
|
||||
|
||||
## Kernel theory
|
||||
|
||||
The most plausible explanation for the problem is the introduction
|
||||
of a global lock for all optical drives which is held during the
|
||||
whole transaction time of `ioctl(SG_IO)`.
|
||||
This ioctl is used by libburn to send SCSI commands to the burner
|
||||
drive. So each single burner blocks the other libburn processes
|
||||
until it has ended its transaction.
|
||||
|
||||
See the problematic changeset which affected `drivers/scsi/sr.c` among
|
||||
many other kernel parts:
|
||||
|
||||
https://lkml.org/lkml/2010/9/14/338
|
||||
|
||||
and the summary of consequences with remedy proposal:
|
||||
|
||||
http://marc.info/?l=linux-scsi&m=135705061804384&w=2
|
||||
|
||||
Obviously the deprecated device file family `/dev/sg*` does not have such
|
||||
a lock.
|
||||
|
||||
# Consequences for libburn
|
||||
|
||||
## Using /dev/sg* against all good advise
|
||||
|
||||
The libburn call `burn_preset_device_open()`, cdrskin option
|
||||
`drive_scsi_dev_family=`, and xorriso command `-scsi_dev_family`
|
||||
can cause libburn to use `/dev/sg*` instead of `/dev/sr*`.
|
||||
Without such special setting a `/dev/sg*` address given by the user would
|
||||
be mapped to the corresponding `/dev/sr*`.
|
||||
|
||||
These runs of version 1.4.4 or higher can coexist without throughput
|
||||
problems:
|
||||
```
|
||||
xorriso -scsi_dev_family sg -dev /dev/sr0 -map ./data /data
|
||||
```
|
||||
```
|
||||
xorriso -as cdrecord drive_scsi_dev_family=sg dev=/dev/sr1 -v image2.iso
|
||||
```
|
||||
```
|
||||
cdrskin drive_scsi_dev_family=sg dev=/dev/sr3 -v image3.iso
|
||||
```
|
||||
|
||||
### /dev/sg with older versions of cdrskin
|
||||
|
||||
A bug in libburn-0.5.2 to 1.4.2 prevented automatic conversion from `/dev/sr*`
|
||||
addresses to `/dev/sg*` addresses if `drive_scsi_dev_family=sg` is given.
|
||||
xorriso up to version 1.4.2 did not offer the opportunity to use `/dev/sg*`.
|
||||
|
||||
Nevertheless it is possible to let older cdrskin versions work with `/dev/sg*`:
|
||||
```
|
||||
$ cdrskin drive_scsi_dev_family=sg --devices
|
||||
...
|
||||
0 dev='/dev/sg2' rwrw-- : 'HL-DT-ST' 'BDDVDRW GGC-H20L'
|
||||
1 dev='/dev/sg3' rwrw-- : 'HL-DT-ST' 'DVDRAM GH24NSC0'
|
||||
2 dev='/dev/sg4' rwrw-- : 'ASUS ' 'BW-16D1HT'
|
||||
3 dev='/dev/sg5' rwrw-- : 'HL-DT-ST' 'BD-RE GGW-H20L'
|
||||
4 dev='/dev/sg6' rwrw-- : 'Optiarc ' 'BD RW BD-5300S'
|
||||
```
|
||||
```
|
||||
$ cdrskin drive_scsi_dev_family=sg dev=/dev/sg2 -v image1.iso
|
||||
$ cdrskin drive_scsi_dev_family=sg dev=/dev/sg3 -v image2.iso
|
||||
$ cdrskin drive_scsi_dev_family=sg dev=/dev/sg6 -v image3.iso
|
||||
```
|
||||
|
||||
Meanwhile the releases on [release page](Releases)
|
||||
have the bug fixed and xorriso augmented by a new command.
|
||||
|
||||
## Staying with /dev/sr* as bad as it is
|
||||
|
||||
Despite the fine performance of `/dev/sg*` it remains desirable to use
|
||||
`/dev/sr*` because `/dev/sg` is deprecated by the kernel developers,
|
||||
the translation from `/dev/sr` to `/dev/sg` is not guaranteed to work in future,
|
||||
and `/dev/sr*` is better coordinated with `mount(8)` and `open(2)` for
|
||||
`read(2)`.
|
||||
|
||||
So long lasting SCSI transactions via `/dev/sr*` cause long
|
||||
delays of communication with the other drives. Some of these delays
|
||||
cannot be avoided.
|
||||
E.g. the SCSI command to eject the tray needs several seconds to be
|
||||
completed.
|
||||
|
||||
Another long delay can be circumvented, though:
|
||||
|
||||
If the buffer of a drive is nearly full and a WRITE command
|
||||
arrives, then the drive may delay the reply until there is room
|
||||
in the buffer for the next WRITE command.
|
||||
Depending on the firmware and buffer size, this may last quite some
|
||||
time. Further the time granularity of lock waiting seems quite coarse.
|
||||
|
||||
These long waiting WRITE commands can be avoided if libburn keeps
|
||||
itself from filling the drive buffer to a level where the firmware
|
||||
would begin to delay the reply.
|
||||
|
||||
xorriso command `-modesty_on_drive`, cdrskin option
|
||||
`modesty_on_drive=`, and libburn call `burn_drive_set_buffer_waiting()`
|
||||
apply a strategy which stems from the days of IDE when the slow CD drive
|
||||
clogged the IDE controller which it shared with a HDD.
|
||||
|
||||
Example:
|
||||
```
|
||||
-modesty_on_drive on:min_percent=90:max_percent=95
|
||||
```
|
||||
|
||||
Some drive firmwares work well with partly empty buffer, some don't.
|
||||
|
||||
Regrettably there is no similar remedy known for reading from /dev/sr*
|
||||
via ioctl(SG_IO).
|
||||
|
||||
### Parameter considerations
|
||||
|
||||
Those drives which can work well with `-modesty_on_drive` still may need
|
||||
adjustment of the modesty parameters.
|
||||
|
||||
The threshold for delaying further WRITE commands is controlled by
|
||||
parameter `max_percent`. The threshold for resuming to send WRITE
|
||||
commands is `min_percent`.
|
||||
|
||||
So if `min_percent=90:max_percent=95` does not show the desired effect
|
||||
of reaching about 80 to 90 percent of the throughput of an undisturbed
|
||||
burn run of a single burner, then one has to try variations.
|
||||
Keep in mind that `min_percent` has to stay lower than `max_percent`.
|
||||
|
||||
Drives have been observed to report their buffer fill too low. This
|
||||
risks to send a long blocking WRITE command by mistake.
|
||||
A lower `max_percent` percent value may compensate.
|
||||
```
|
||||
-modesty_on_drive on:min_percent=75:max_percent=80
|
||||
```
|
||||
|
||||
Drives have been observed to become even slower by waiting for more
|
||||
input before writing if their buffer is not full enough.
|
||||
A higher `min_percent` may help.
|
||||
```
|
||||
-modesty_on_drive on:min_percent=95:max_percent=97
|
||||
```
|
||||
|
||||
Drives have been observed to slow down their write speed if the
|
||||
input comes in small amounts with some short waiting time inbetween.
|
||||
A larger gap between `min_percent` and `max_percent` may help
|
||||
to get larger write amounts without intermediate waiting.
|
||||
```
|
||||
-modesty_on_drive on:min_percent=75:max_percent=95
|
||||
```
|
||||
|
||||
Finally there are drives which perform poorly with stream recording if
|
||||
their buffer is not completely full. This means that they will not
|
||||
be able to burn DVD-RAM, BD-RE, or formatted BD-R at full nominal speed
|
||||
if `-modesty_on_drive` is set to `on`.
|
Loading…
Reference in New Issue
Block a user