Here's what I have done so far:
Using more Rx/Tx buffers boosts performance the most from defaults. I set RSS Queues to 4 on each adapter, and specified starting RSS CPU on the second port to something other than 0 (it's 16 on the PC that I use, with 16 cores, 32 HTs).
From watching ProcessExplorer, I am limited by CPU's ability to handle the large number of incoming interrupts, even with RSS enabled. I am using PCIe x8 (electrical) slot in 2.x mode. Each of the two adapters connects with a 5GT/sec x8 bus.
OS responsiveness does not matter, I/O throughput does. I am limited by clients' inability to process Jumbo packets.
What settings should I try next?
Details: Dual Xeon-E5 2665, 32 GB RAM, eight SSDs in RAID0 (RAMDrive used for NIC perf validation), 1TB data to be moved via IIS/FTP from 400 clients, ASAP.
In response to comments:
Actual read throughput is 650 MB/sec over a teamed pair of 10Gb/sec links, into RAM Drive
Antivirus and firewall are off, AFAICT. (I have fairly good control over what's installed on the PC, in this case. How can I be sure that no filters are reducing performance? I will have to follow up, good point.)
In Process Explorer, I see spells of time where CPU keeps going (red, kernel time), but network and disk I/O are stopped
Max RSS processors is at its default value, 16
Message-signaled intrrupts are supported on both instances of X520-DA2 device, with MessageNumberLimit set to 18. Here's what I see on my lowly desktop card
One of the problems with high performance NIC's is that the modern PC architecture has a bit of trouble keeping up. But, in your case, this isn't so much the problem. Let me explain.
The CPU has to do a lot of work processing TCP packets. This affects the throughput. What's limiting things in your case is not the network hardware, but the ability of the server to saturate the network links.
In more recent times, we've seen processing move from the CPU to the NIC like checksum offload. Intel have also added features to help reduce the load further. That's cool and I'm sure all optimizing features are turned on.
As you've alluded to, jumbo frames - actually that helps throughput somewhat. But not as much as RDMA.
Most 10GBit ethernet hardware will have a very nice underutilized feature called RDMA or remote direct memory access. It allows the NIC to do memory to memory copies over the network without the intervention of the CPU. Well, OK the CPU tells the NIC what to do and then the NIC does the rest. The trouble is, it's not used much yet. But it's getting there. Apparently, in the most recent version of Microsoft Windows Server 2012, they have something called SMB Direct. It uses RDMA. So, if you want to increase throughput, you want to use that.
Are you able to put together some test hardware and install it onto there to see how it performs?
By the way, I'm not sure if you will see it at 10Gbit so much, but fast RAM helps with RDMA especially with 56Gbit Infiniband. In general, it's best to use the fastest RAM your server supports.
Also note this comment on the SMB Direct link I put above:
Update: Looks like not ALL 10GBit NIC's support RDMA for some reason. So check your model's features first.
Another thought I had was the type of protocol being used to do your testing may be affecting the results. i.e. protocol overhead on top of TCP overhead. I suggest you look into using something that can test without touching the hard drive such as iperf. There is a windows port of it somewhere.
I think this question: Why does my gigabit bond not deliver at least 150 MB/s throughput? is related to your problem. I was talking about a Dell PowerEdge 6950 there. The answer was basically "use jumbo frames" to reduce the interrupts. I can imagine that tuning the offload-engine of the network-card might help in your case, but I do not know how to do so on W2K8R2.
Idea: Raise number of buffers in the network card, raise the interrupt-triggor for packets in the buffer, so each interrupt will handle more packets (i.e pass them to the OS-IP-stack).
See this link: Setting coalescence-parameters with ethtool for 10 Gb this is what I am basically referring to.
Your cpu utilization screenshot shows 2 potential bottlenecks:
To address the former:
As to the latter (not knowing what app you are actually using):
If that 1 core maxing out in user mode indicates your single-threaded (or single-thread bottle-necked) app, it should be
to use multiple cores, which might or might not be trivial.
Also, as your app (if it is indeed your app), apparently runs on a NUMA node #1, but packet handling by the kernel is done on NUMA node #0,
E.g. by right clicking on the process in Task Manager, which will give you the option to change that, at least in Win2012R2. I tried it, and for me it did not help, but it's worth a try, as it might improve the cache hit rate.
Btw, is the machine in question sending? Receiving? Both? In terms of configuring your system for performance, sending and receiving are almost completely unrelated, although my suggestions above cover both.