[Eisfair_dev] Samba 11.5.0 testing:Oplocking geändert

Marcus Röckrath marcus.roeckrath at gmx.de
Do Apr 8 10:14:57 CEST 2021


Hallo,

auf Anregung und Mitarbeit von Thomas habe ich das Oplocking in Samba
(Parameter SAMBA_OPLOCKS) etwas geändert.

Für alle, bei denen dieser Parameter auf no steht, ändert sich nichts, nur
bei yes ist das Verhalten geändert/verfeinert.

Was sind OPLOCKS (opportunistisches Locking); hierzu ein älteres Zitat, was
dies ganz gut erklärt:

"Windows benutzt zur Steigerung der Performance ein Opportunistisches
Sperren. Durch einen solchen oplock erhält ein Client, solange er der
einzige ist, der die Datei in Benutzung hat einen exklusiven Zugriff auf
die gesamte Datei und der Client darf seine IO Aufträge cachen. Durch
dieses Caching wird der Netzwerktraffic deutlich verringert, da nicht jede
kleine Änderung innerhalb der Datei über das Netz übertragen werden muss.
Wenn nun jedoch ein weitere Client auf diese Datei zugreifen möchte, muss
dieser Client erstmal warten, bis der Oplock haltende Client seinen Cache
mit dem Server synchronisiert hat.
Diese Technik funktioniert sehr gut, wenn nur Windows Clients auf den Samba
Share zugreifen, da Samba die Benachrichtigung über Oplocks an die Clients
verschickt.
Wenn nun ein Unix Prozess an Samba vorbei auf eine Datei zugreift, auf die
ein Windows Prozess ein Oplock hält, dann bekommt Samba davon nichts mit.
Der Unix Prozess kann diese Datei editieren und auch speichern, doch sobald
der Windows Prozess die Datei schließt und seinen Cache leert werden diese
Änderungen verloren sein und von Samba überschrieben."
[http://www.schmidti.de/blog/lockinginsamba]


Bislang wurde bei SAMBA_OPLOCKS=yes folgendes in der smb.conf gesetzt:

oplocks = yes
kernel oplocks = yes
level2 oplocks = yes
veto oplock files
= /*.bak/*.cd*/*.cur/*.*db/*.db*/*.*dx/*.dxf/*.dwg/*.doc/*.fpt/*.igs/*.ia*/*.id*/*.in*/*.ip*/*.log/*.mpp/*.ndx/*.ntx/*.opt/*.ord/*.ppt/*.pst/*.qb*/*.sjb/*.sbs/*.slp/*.st*/*.vsd/*.xl*/"
echo " kernel oplocks = $SAMBA_OPLOCKS"
echo " oplocks = $SAMBA_OPLOCKS"
echo " level2 oplocks = $SAMBA_OPLOCKS"
# This is deprecated
# echo " blocking locks = $SAMBA_OPLOCKS"

if [ "$SAMBA_OPLOCKS" = "yes" ]
then
    echo " veto oplock files
= /*.bak/*.cd*/*.cur/*.*db/*.db*/*.*dx/*.dxf/*.dwg/*.doc/*.fpt/*.igs/*.ia*/*.id*/*.in*/*.ip*/*.log/*.mpp/*.ndx/*.ntx/*.opt/*.ord/*.ppt/*.pst/*.qb*/*.sjb/*.sbs/*.slp/*.st*/*.vsd/*.xl*/"

Allerdings ist "level2 oplocks" ohne Funktion, wenn "kernel oplocks"
aktiviert ist.

In der "veto oplock files"-Zeile sind die Dateimasken angegeben, für die
kein Oplocking stattfindet.


Das neue Samba-Paket fügt nun die SAMBA_KERNEL_OPLOCKS als
Konfigurationsoption hinzu, damit die sich ausschließenden Optionen "kernel
oplocks" und "level2 oplocks" nutzbar sind.


Wenn auf eine Samba-Share auch lokal vom Server oder mittels anderer
Freigabetechniken (z. B. NFS) zugegriffen wird, sind "kernel oplocks"
zwingend zu aktivieren, ansonsten aus Performancegründen "level2 oplocks".


Das Paket konfiguriert nun so:

1. SAMBA_OPLOCKS=yes und SAMBA_KERNEL_OPLOCKS=yes:
oplocks = yes
kernel oplocks = yes
level2 oplocks = yes

Dabei ist "level2 oplocks" zwar gesetzt, aber wegen der Nutzung der "kernel
oplocks" inaktiv, also bedeutungslos.


2. SAMBA_OPLOCKS=yes und SAMBA_KERNEL_OPLOCKS=no:
oplocks = yes
kernel oplocks = no
level2 oplocks = yes


Die Direktive "veto oplock files" wird nicht mehr gesetzt.


Die bislang im Paket bei SAMBA_OPLOCKS=yes gesetzte Option erreicht man nun,
indem man auch SAMBA_KERNEL_OPLOCKS auf yes setzt, wobei nun eben die "veto
oplocks files" Direktive fehlt.


OpenSuSE setzt das ähnlich:

# testparm -sv | grep oplock
        veto oplock files = 
        kernel oplocks = No
        oplocks = Yes
        level2 oplocks = Yes

Wer ein Ubuntu, RedHat, ... mit Samba-Server laufen hat, kann gerne mal die
dortige Konfiguration posten.

Ich bitte um Tests und Kommentare.

-- 
Gruß Marcus
[eisfair-Team]


Mehr Informationen über die Mailingliste Eisfair_dev