I cleaned up the logging a bit more (github.com/jameinel/juju/ 2.3-leadership-logging is a work in progress). With a slightly munged log to fit launchpad limits it looks like this. The first bit in [] is the first 6 digits of the modeluuid or controller uuid, and the other is the %p of the manager instance. I also updated my deployment with 6 applications of ubuntu-lite (so a total of 7 applications in the model). One thing that is blatantly obvious is that we are waking up the same manager many times. Exactly the same modeluuid and model address. 21:14:15.442 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.991s 21:14:15.656 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.991s 21:14:15.864 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.991s 21:14:15.896 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.991s 21:14:16.450 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 57.998s 21:14:25.973 ... [b6b503 0xc4202a83c0] waking to check (2) leases in 35.991s 21:14:31.471 ... [b6b503 0xc4202366c0] waking to check (1) leases in 60.000s 21:14:31.785 ... [b6b503 0xc4202a83c0] waking to check (2) leases in 53.998s 21:14:45.119 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.992s 21:14:45.214 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.992s 21:14:45.446 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.992s 21:14:45.647 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.992s 21:14:45.868 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.992s 21:14:45.908 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.992s 21:14:46.451 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 59.000s 21:14:53.322 ... [6200f8 0xc420236180] waking to check (0) leases in 60.000s 21:14:53.442 ... [6200f8 0xc420236540] waking to check (0) leases in 60.000s 21:14:55.222 ... [b6b503 0xc4202360c0] waking to check (2) leases in 30.992s 21:14:56.042 ... [b6b503 0xc4202a83c0] waking to check (2) leases in 35.993s 21:15:01.509 ... [b6b503 0xc4202366c0] waking to check (1) leases in 60.000s 21:15:01.820 ... [b6b503 0xc4202a83c0] waking to check (2) leases in 53.998s 21:15:15.114 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.991s 21:15:15.212 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.991s 21:15:15.452 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.992s 21:15:15.657 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.992s 21:15:15.867 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.991s 21:15:15.899 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.991s 21:15:16.448 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 59.000s 21:15:26.072 ... [b6b503 0xc4202a83c0] waking to check (2) leases in 35.993s 21:15:26.218 ... [b6b503 0xc4202360c0] waking to check (2) leases in 35.993s 21:15:31.545 ... [b6b503 0xc4202366c0] waking to check (1) leases in 60.000s 21:15:31.861 ... [b6b503 0xc4202a83c0] waking to check (2) leases in 54.998s 21:15:45.119 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.992s 21:15:45.214 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.992s 21:15:45.441 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.992s 21:15:45.653 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.992s 21:15:45.855 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.992s 21:15:45.885 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.992s 21:15:46.454 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 59.000s 21:15:53.325 ... [6200f8 0xc420236180] waking to check (0) leases in 60.000s 21:15:53.469 ... [6200f8 0xc420236540] waking to check (0) leases in 60.000s 21:15:56.107 ... [b6b503 0xc4202a83c0] waking to check (2) leases in 34.993s 21:16:01.583 ... [b6b503 0xc4202366c0] waking to check (1) leases in 60.000s 21:16:01.901 ... [b6b503 0xc4202a83c0] waking to check (2) leases in 54.999s 21:16:02.214 ... [b6b503 0xc4202360c0] waking to check (2) leases in 53.998s 21:16:15.127 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.992s 21:16:15.223 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.992s 21:16:15.443 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.992s 21:16:15.650 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.992s 21:16:15.871 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 29.992s 21:16:15.910 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 30.992s 21:16:16.454 ... [3647c1 0xc4205d03c0] waking to check (7) leases in 58.000s 21:16:26.147 ... [b6b503 0xc4202a83c0] waking to check (2) leases in 35.993s 21:16:31.625 ... [b6b503 0xc4202366c0] waking to check (1) leases in 60.000s 21:16:31.941 ... [b6b503 0xc4202a83c0] waking to check (2) leases in 53.998s As near as I can tell, this is actually just logging noise. The issue is that. The core component of Manager.loop(): func (manager *Manager) choose(blocks blocks) error { select { case <-manager.catacomb.Dying(): return manager.catacomb.ErrDying() case <-manager.nextTick(): return manager.tick() case claim := <-manager.claims: return manager.handleClaim(claim) case check := <-manager.checks: return manager.handleCheck(check) case block := <-manager.blocks: blocks.add(block) return nil } } That means that any time we handleClaim or handleCheck or deal with a block, we go off and do some work and then come back to figure out what we will be blocking on. Which means we re-evaluate manager.nextTick(). So if you have 7 applications, all of them are naturally refreshing their claims, and thus we get 7 'handleClaim' calls per 30s. But then we don't actually trigger on any of those nextTick() calls because we woke up for the handleClaim (and if everything is actually operating correctly all of those handleClaim calls will actually be extending the lease which means we don't need to wake up to tick() on them.)