For thermal-only models using the default MATMET=12 single matrix method, then 20 to 40 LOOPCT should be the most STEADY should take. Exceptions include jittery user logic (heaters etc.), or very sharp property gradients, or tight values of controls like EBALSA, DRLXCA.
Therefore, I'd recommend setting NLOOPS to no more than 50 (for MATMET=12 in an all-SINDA situation). If it takes longer than that, the model is probably oscillating.
That is the good and bad for the matrix solution. It nails the problem in a few iterations ... unless it doesn't, and in that case it will never converge.
Since it is linearized and takes all nodes on a single jump each solution step, it can oscillate about the final answer if there are strong temperature dependencies or jittery user logic. In V5.3 there is a new feature that tries to detect this situation (based on more than half the nodes misbehaving) and autonomously switch to damping sufficient to stop oscillations (EXTLIM=0.5, ITERXT=0). But if you have just a few nodes oscillating, it might not decide to take that somewhat drastic step (philosophically, we try very hard not to override user-supplied controls).
So one trick is to set NLOOPS=50 then call two STEADY runs in a row, using registers to set the EXTLIM and ITERXT for all submodels between the two calls. If the second run isn't needed, it won't hurt (because it will converge in two steps).
For example:
header register data
int:my_matmet = 12 $ just in case you want to ever change it
int:my_iterxt = 3
my_extlim = 1.0 $ a little tighter than the default
header control data, global
matmet = my_matmet
iterxt = my_iterxt
extlim = my_extlim
nloops = 50
header operations
call steady
my_iterxt = 0
my_extlim = 0.5
call steady
Note that if a fluid submodel is present, the above tricks still apply, and in fact the presence of the fluid submodel can be a source for oscillations. However, in that case you might want to start with larger NLOOPS.