After further research, I've been able to get the load on each server down to an acceptable 0.05-0.50 on average -- in large part, this was accomplished by tuning some parameters to values that "made sense" for us.
For anyone following along, here's the list of the parameters I adjusted, along with some good references to understanding them.
DataMemory
IndexMemory
- Remember, these will need to be stored in RAM, so make sure you set them to acceptable values.
TimeBetweenLocalCheckpoints
NoOfFragmentLogFiles
RedoBuffer
NoOfDiskPagesToDiskAfterRestartACC
NoOfDiskPagesToDiskAfterRestartTUP
NoOfDiskPagesToDiskDuringRestartACC
NoOfDiskPagesToDiskDuringRestartTUP
- These are all highly related, and you'll need to set them according to the value of READ/WRITE traffic you have. These sites are good to understanding what the values should be:
http://lists.mysql.com/cluster/3119
http://mikaelronstrom.blogspot.com/2005/10/calculating-parameters-for-local.html
http://dev.mysql.com/doc/refman/5.0/en/mysql-cluster-db-definition.html?ff=nopfpls
Many others as well, such as:
MaxNoOfAttributes
MaxNoOfConcurrentOperations
MaxNoOfLocalOperations
MaxNoOfOrderedIndexes
MaxNoOfUniqueHashIndexes
You might not want to mess with them if you don't need to, and don't understand them.
These are just parameters for tuning the MySQL Cluster/NDB side of things. Depending on your bottleneck (ours was ndbd), you might also look into tuning the mysqld side.
Finally, you might like to also try:
ndb_force_send=0
ndb_use_exact_count=0
These seem to offer some performance benefit if throughput between nodes is not absolutely critical.