FreeBSD sollte schon die Geschwindigkeit von Linux erreichen. Stochern wir also mal weiter im Dunkeln. Da wir die NIC ja nun weitgehend ausschließen können, wenden wir uns man dem eigentelichen Netzwerkstack zu. Der kommt - typisch für FreeBSD - in einer konservativen Vorkonfiguration, die Leistung kostet. Daher eine Sysctl für /etc/sysctl.conf:
Erhöhe die Socketbuffer. Das kostet Speicher, aber davon hat man heute eh genug. Durch größere Buffer ersparen wir der CPU unnütze Kontextwechsel und der Anwendung unnütze Arbeit. 16 Megabyte sind für 1Gbit genug, für 10GBit sollten es dann mindestens 32 sein.
Code:
kern.ipc.maxsockbuf=16777216
Gleiches gilt für die kerneleigenen Buffer, sie sind geradezu lächerlich niedrig. Daher heben wir erst einmal den Grundwert drastisch an. Auch hier 16 Megabyte.
Code:
net.inet.tcp.sendbuf_max=16777216
net.inet.tcp.recvbuf_max=16777216
Diese Buffer können vom Kernel automatisch angepasst werden. Allerdings ist in Standardeinstellung die Schrittweite recht gering. Daher erhöhen wir die deutlich:
Code:
net.inet.tcp.sendbuf_inc=16384
net.inet.tcp.recvbuf_inc=524288
Dann hat FreeBSD das legendäre BSD Inflight Limiting, was unter Umständen den Durchsatz an maximalen Paketen beschränkt, um Überlastsituationen zu vermeiden. Das ist in LANs und bei modernen Gigabit-Verbindungen eher hinderlich, daher schalten wir es ab:
Code:
net.inet.tcp.inflight.enable=0
FreeBSD hat außerdem die Angewihnheit Verbindungen automatisch zu tunen und sich die so ermittelten Werte zu merken. Das ist gut und schön, aber verfälscht deine Messergebnisse. Schalten wir es also ab, bzw. limitieren es auf die von der RFC geforderten 5 Minuten. Je nachdem was die Magie will.
Code:
net.inet.tcp.hostcache.expire=1
Ich hoffe, dass hilft dir ein wenig.

Wenn nicht, müsste man sich die mbufs vornehmen. Prüfen, wie viele genutzt werden, ob genügend vorhanden sind und sonst dafür sorgen, dass es mehr gibt. Das kann man dann sehen.