Thanks to everyone. There was no cron job doing anything to the site, but I did find the solution. To document and share, here's what's happened since this morning.
1) Cron job. That one puzzled me and after some looking around, I realized that there WAS a cron job calling <drupalsite>/cron.php every five minutes. When I thought about it -- of COURSE! That job is still running on the server that I'm migrating from! Duh. As soon as the web site moved to linode, the job continued merrily running along. I found that and stopped it, but still no performance improvement.
(And to be fair, I wasn't expecting it to improve -- there's no reason why a single cron job should impact performance that much).
2) I called upon a friend who is a MySQL DBA. He looked at the my.cnf settings that came out of the box with a Debian MySQL install, plus the recommended changes I made from the "memory-networking" online linode doc. He said the settings were hosed and sent me a new my.cnf.
3) That, in itself, was an improvement, but it barely registered on the needle. However, one of the settings he included was to turn on slow query log.
Now, to be fair, linode Support also recommended this, but in my arrogance, I said "Nah, I know this is working, so there should be no long running queries" and so I didn't do that. Mistake. Mea culpa.
4) I checked the slow query log and spotted a job which was running every five minutes and was trying to prune back the Drupal watchdog logfile (basically, catching errors in execution). From prior Drupal experience, I know this watchdog is a source of pain for many sites, but I never before had any problems.
Okay, so this query was taking 25s-30s every 5 minutes. It shouldn't... I looked at how many rows it was evaluating to prune back the logfile and it was almost 10.5 MILLION rows. WTF?? How did that logfile, which shouldn't have been over 1,000 rows, get that big. Well...
Seems that there must be a bug in MySQL v5.1.49. I have only found a couple references to it, but it seems that when you try to delete from a very large file (where < timestamp), it fails. This caused Drupal to write even more rows to the table, and so it was growing fast and furious.
I truncated the table to zero, fixed a couple of bugs in the Drupal code (that were already in there anyhow (ereg depreciated)) and then added an index.
I let the system quiesce and now the disk io is back to about, um, ZERO! Yay! See the following graph now...
Thanks to everyone for help and suggestions. Really appreciate it.
In summary, the first thing I should have done is turn on the slow query log and watched for problems. That would have led me to the obvious pig in the database.
The variable settings in my.cnf will probably improve performance in the long run, so those were helpful as well.
Thanks!
bruce
