Run SQL trace of long running queries and deadlocks. This shows no
deadlocks at the times of the problems, and long running queries all
coincide with our timeout errors, but look to be a side effect, and
not the cause. Queries that are very basic that typically return
instantly end up taking 30, 60 or 120 seconds to run at times. This
happens for a few minutes then everything picks up and works fine
after that.
It looks like some queries/transaction lock your database till they are done. You have to find out which queries are blocking and rewrite them/run them at an other time to avoid blocking other processes. At this moment the waiting queries just timeout.
An extra point to dig into is the auto increment size of your transaction log and database. Set them on a fixed size instead of a percentage of the current files. If files are getting taller the time it takes to allocate enough space will eventually longer as your transaction timeout. And your db comes to a halt.