Hi Wes,
There are a couple of concepts here…
First an important point, timeouts only apply to messages that are in-flight (have been sent to a consumer), not queued.
When nsqd delivers a message to a consumer it starts a timeout while waiting for a response. There are 3 possible responses. FIN "finish" will tell nsqd that the consumer is done and to discard the message, REQ "requeue" will tell nsqd that something went wrong and it should put the message back on the queue (with an optional defer duration), and TOUCH indicates that the consumer needs more time to process the message and nsqd should extend the timeout.
On the nsqd side there are a few configurable options that affect the above behavior.
msg-timeout - The initial timeout for a message after being sent to a consumer. If the timeout expires without a response the message will be automatically re-queued and delivered to a ready consumer.
max-msg-timeout - A consumer can TOUCH a message and extend the default timeout up to this value. Effectively, this is the maximum amount of time a msg can remain in-flight.
In nsqadmin (or just /stats output of nsqd) "timed out" counts the # of messages that were re-queued due to unresponsive clients according to above.
Hope this helps. Let me know if you have any other questions.
Regards,
Matt