You have to be aware of the capabilities of each piece of your stack. What kind of disks make up the filesystem for the NFS share? SAS? SATA? SSD? What type and size, and rpm speed of each? rotational latency? Is it a 4k drive? ZFS is optimized for 512-byte drives, and there are known issues with performance using new "advanced format" disks.
What size is your I/O workload? That also affects how fast your storage will appear.
From a purely storage perspective, these questions will affect how fast data can be written to and read from the backend disks. For example, let's say your NFS share was coming from a filesystem on a 7200 RPM 1TB SATA disk, and that your workload size is 64KB and is mostly random.
Random Workload, 64 KB IO size
--------------------------------------------------------------------------------
Average Read Seek Time: 8.4 ms
Average Write Seek Time: 8.9 ms
Rotational latency: .120 ms
Average Latency: 4.166 ms
Average Read Service Time: 12.566 ms
Average Write Service Time: 13.066 ms
--------------------------------------------------------------------------------
Best Case Read IOPs: 79.000
Best Case Write IOPs: 76.000
--------------------------------------------------------------------------------
Best Case Read Throughput: 4.937 MB/s
Best Case Write Throughput: 4.750 MB/s
--------------------------------------------------------------------------------
Real World Read IOPs: 55.300
Real World Write IOPs: 53.200
--------------------------------------------------------------------------------
Real World Read Throughput: 3.325 MB/s
Real World Write Throughput: 3.325 MB/s
--------------------------------------------------------------------------------
That will give you an idea of the real world performance you can expect to get from a single disk at a certain workload size.
You can boost that performance by having a write-cache, or mounting your NFS filesystem asynchronously, so that write confirmations are not required before the next I/O begins (not that I recommend that, as it puts your data at risk).
Once you understand the performance of your backend storage, then you can start to look at additional overhead created by NFS (is it v3? v4? tcp? udp?), or SSH (which encryption algorithm are you using? you can use a lighter algorithm like arcfour to improve performance), or the network itself. Do you have a cheap-o 1GbE NIC? or a higher-end server quality NIC? are you sharing that nic between multiple services? is anything else generating traffic on your network? How about network congestion, collisions, or high retransmission rates?
All of these add up together to reduce even further the apparent performance of your backend storage, which really means that they all add up to make things appear very slow on the client side.
Now, the numbers above are a kind of worst case scenario, right? 100% random synchronous workload. If you have a sequential workload, or you can raise your IO workload size, you can dramatically raise performance. For example, if you can bump your IO size to 128k, you'll double your performance, and depending on your NFS client, you may be able to set rsize, and wsize, to various settings to test performance. There is after all a point of diminishing returns.
And if you have multiple disks, in mirror, or RAID, you'll have to adjust your numbers for that.
Real World Disk Performance is almost never what's printed on the side of the box that the disk came in.
zfs iostatoutput. – Gert van den Berg Dec 31 '12 at 8:56