I'll take a closer look in a bit, but first thing's first, you definitely need to increase (at least triple if you can), the size of the query cache. You have a huge number of low mem prunes, which indicates that MySQL is swapping query results in and out of the cache because it doesn't have nearly enough room.
Also, we need to figure out which queries are causing the temporary disk tables to be written. Run a number of SHOW FULL PROCESSLISTs and catch some poor performing queries in the slow query log, looking for queries that appear in the processlist for long periods of time in status: "Creating temp table". Your Created_tmp_disk_tables and Created_tmp_tables variables are _relatively_ high, IMHO, and may be a cause for some contention.
Also, how many concurrent users are you consistently running?
To properly diagnose, I'll also need the output from your SHOW VARIABLES; as well.
Cheers,
Jay Pipes
Community Relations Manager, North America, MySQL Inc.
Got Cluster?
http://www.mysql.com/cluster
Personal:
http://jpipes.com