From 840d8e21dd4833fc859998bb0e77b31f70b6ffd7 Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Thu, 1 Jun 2017 16:26:11 +0200 Subject: erts: Add statistics for cpoll fetch attempts --- erts/emulator/beam/erl_alloc_util.c | 58 +++++++++++++++++++++++++++++++++++-- erts/emulator/beam/erl_alloc_util.h | 6 ++++ 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/erts/emulator/beam/erl_alloc_util.c b/erts/emulator/beam/erl_alloc_util.c index 230ca6ccbb..c5b787bd8c 100644 --- a/erts/emulator/beam/erl_alloc_util.c +++ b/erts/emulator/beam/erl_alloc_util.c @@ -3306,6 +3306,7 @@ cpool_fetch(Allctr_t *allctr, UWord size) if (--i <= 0) { /* Move sentinel to continue next search from here */ relink_edl_before(dl, &allctr->cpool.pooled_list); + INC_CC(allctr->cpool.stat.fail_pooled); return NULL; } } @@ -3356,8 +3357,10 @@ cpool_fetch(Allctr_t *allctr, UWord size) relink_edl_before(dl, &allctr->cpool.traitor_list); if (i > 0) break; - else + else { + INC_CC(allctr->cpool.stat.fail_traitor); return NULL; + } } } @@ -3421,8 +3424,10 @@ cpool_fetch(Allctr_t *allctr, UWord size) return crr; } } - if (--i <= 0) + if (--i <= 0) { + INC_CC(allctr->cpool.stat.fail_shared); return NULL; + } } check_dc_list: @@ -3445,10 +3450,15 @@ check_dc_list: return crr; } crr = crr->prev; - if (--i <= 0) + if (--i <= 0) { + INC_CC(allctr->cpool.stat.fail_pend_dealloc); return NULL; + } } + if (i != ERTS_ALC_CPOOL_MAX_FETCH_INSPECT) + INC_CC(allctr->cpool.stat.fail); + return NULL; } @@ -3801,6 +3811,7 @@ create_carrier(Allctr_t *allctr, Uint umem_sz, UWord flags) crr = cpool_fetch(allctr, blk_sz); if (crr) { STAT_MBC_CPOOL_FETCH(allctr, crr); + INC_CC(allctr->cpool.stat.fetch); link_carrier(&allctr->mbc_list, crr); (*allctr->add_mbc)(allctr, crr); blk = (*allctr->get_free_block)(allctr, blk_sz, NULL, 0); @@ -4252,6 +4263,12 @@ static struct { Eterm mbcs; #ifdef ERTS_SMP Eterm mbcs_pool; + Eterm fetch; + Eterm fail_pooled; + Eterm fail_traitor; + Eterm fail_shared; + Eterm fail_pend_dealloc; + Eterm fail; #endif Eterm sbcs; @@ -4342,6 +4359,12 @@ init_atoms(Allctr_t *allctr) AM_INIT(mbcs); #ifdef ERTS_SMP AM_INIT(mbcs_pool); + AM_INIT(fetch); + AM_INIT(fail_pooled); + AM_INIT(fail_traitor); + AM_INIT(fail_shared); + AM_INIT(fail_pend_dealloc); + AM_INIT(fail); #endif AM_INIT(sbcs); @@ -4627,6 +4650,32 @@ info_cpool(Allctr_t *allctr, if (hpp || szp) { res = NIL; + + add_3tup(hpp, szp, &res, am.fail_pooled, + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.fail_pooled)), + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.fail_pooled))); + + add_3tup(hpp, szp, &res, am.fail_traitor, + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.fail_traitor)), + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.fail_traitor))); + + add_3tup(hpp, szp, &res, am.fail_shared, + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.fail_shared)), + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.fail_shared))); + + add_3tup(hpp, szp, &res, am.fail_pend_dealloc, + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.fail_pend_dealloc)), + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.fail_pend_dealloc))); + + add_3tup(hpp, szp, &res, am.fail, + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.fail)), + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.fail))); + + add_3tup(hpp, szp, &res, am.fetch, + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.fetch)), + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.fetch))); + + add_2tup(hpp, szp, &res, am.carriers_size, bld_unstable_uint(hpp, szp, csz)); @@ -4641,6 +4690,9 @@ info_cpool(Allctr_t *allctr, add_2tup(hpp, szp, &res, am.blocks, bld_unstable_uint(hpp, szp, nob)); + add_3tup(hpp, szp, &res, am.fetch, + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.fetch)), + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.fetch))); } return res; diff --git a/erts/emulator/beam/erl_alloc_util.h b/erts/emulator/beam/erl_alloc_util.h index 81180382af..2c0d7f7d75 100644 --- a/erts/emulator/beam/erl_alloc_util.h +++ b/erts/emulator/beam/erl_alloc_util.h @@ -574,6 +574,12 @@ struct Allctr_t_ { erts_atomic_t no_blocks; erts_atomic_t carriers_size; erts_atomic_t no_carriers; + CallCounter_t fail_pooled; + CallCounter_t fail_traitor; + CallCounter_t fail_shared; + CallCounter_t fail_pend_dealloc; + CallCounter_t fail; + CallCounter_t fetch; } stat; } cpool; #endif -- cgit v1.2.3 From 3f9759cc7275524736bc8bf400086f188248f9bf Mon Sep 17 00:00:00 2001 From: Sverker Eriksson Date: Wed, 18 Oct 2017 20:03:34 +0200 Subject: Add more cpool stats about why we rejected carriers --- erts/emulator/beam/erl_alloc_util.c | 94 +++++++++++++++++++++++++++++-------- erts/emulator/beam/erl_alloc_util.h | 5 ++ 2 files changed, 79 insertions(+), 20 deletions(-) diff --git a/erts/emulator/beam/erl_alloc_util.c b/erts/emulator/beam/erl_alloc_util.c index c5b787bd8c..68b365bd90 100644 --- a/erts/emulator/beam/erl_alloc_util.c +++ b/erts/emulator/beam/erl_alloc_util.c @@ -3279,8 +3279,16 @@ cpool_fetch(Allctr_t *allctr, UWord size) ASSERT(crr->cpool.orig_allctr == allctr); dl = dl->next; exp = erts_smp_atomic_read_rb(&crr->allctr); - if ((exp & ERTS_CRR_ALCTR_FLG_MASK) == ERTS_CRR_ALCTR_FLG_IN_POOL - && erts_atomic_read_nob(&crr->cpool.max_size) >= size) { + if (erts_atomic_read_nob(&crr->cpool.max_size) < size) { + INC_CC(allctr->cpool.stat.skip_size); + } + else if ((exp & ERTS_CRR_ALCTR_FLG_MASK) != ERTS_CRR_ALCTR_FLG_IN_POOL) { + if (exp & ERTS_CRR_ALCTR_FLG_BUSY) + INC_CC(allctr->cpool.stat.skip_busy); + else + INC_CC(allctr->cpool.stat.skip_not_pooled); + } + else { /* Try to fetch it... */ act = erts_smp_atomic_cmpxchg_mb(&crr->allctr, (erts_aint_t) allctr, @@ -3327,22 +3335,27 @@ cpool_fetch(Allctr_t *allctr, UWord size) dl = dl->next; exp = erts_smp_atomic_read_rb(&crr->allctr); if (exp & ERTS_CRR_ALCTR_FLG_IN_POOL) { - if (!(exp & ERTS_CRR_ALCTR_FLG_BUSY) - && erts_atomic_read_nob(&crr->cpool.max_size) >= size) { - /* Try to fetch it... */ - act = erts_smp_atomic_cmpxchg_mb(&crr->allctr, - (erts_aint_t) allctr, - exp); - if (act == exp) { - cpool_delete(allctr, ((Allctr_t *) (act & ~ERTS_CRR_ALCTR_FLG_MASK)), crr); - unlink_abandoned_carrier(crr); - - /* Move sentinel to continue next search from here */ - relink_edl_before(dl, &allctr->cpool.traitor_list); - return crr; - } - exp = act; - } + if (erts_atomic_read_nob(&crr->cpool.max_size) < size) { + INC_CC(allctr->cpool.stat.skip_size); + } + else if (exp & ERTS_CRR_ALCTR_FLG_BUSY) { + INC_CC(allctr->cpool.stat.skip_busy); + } + else { + /* Try to fetch it... */ + act = erts_smp_atomic_cmpxchg_mb(&crr->allctr, + (erts_aint_t) allctr, + exp); + if (act == exp) { + cpool_delete(allctr, ((Allctr_t *) (act & ~ERTS_CRR_ALCTR_FLG_MASK)), crr); + unlink_abandoned_carrier(crr); + + /* Move sentinel to continue next search from here */ + relink_edl_before(dl, &allctr->cpool.traitor_list); + return crr; + } + exp = act; + } if (exp & ERTS_CRR_ALCTR_FLG_IN_POOL) { if (!cpool_entrance) cpool_entrance = &crr->cpool; @@ -3352,6 +3365,9 @@ cpool_fetch(Allctr_t *allctr, UWord size) link_abandoned_carrier(&allctr->cpool.pooled_list, crr); } } + else { + INC_CC(allctr->cpool.stat.skip_traitor); + } if (--i <= i_stop) { /* Move sentinel to continue next search from here */ relink_edl_before(dl, &allctr->cpool.traitor_list); @@ -3409,8 +3425,17 @@ cpool_fetch(Allctr_t *allctr, UWord size) } crr = (Carrier_t *)(((char *)cpdp) - offsetof(Carrier_t, cpool)); exp = erts_smp_atomic_read_rb(&crr->allctr); - if (((exp & (ERTS_CRR_ALCTR_FLG_MASK)) == ERTS_CRR_ALCTR_FLG_IN_POOL) - && (erts_atomic_read_nob(&cpdp->max_size) >= size)) { + + if (erts_atomic_read_nob(&cpdp->max_size) < size) { + INC_CC(allctr->cpool.stat.skip_size); + } + else if ((exp & (ERTS_CRR_ALCTR_FLG_MASK)) != ERTS_CRR_ALCTR_FLG_IN_POOL) { + if (exp & ERTS_CRR_ALCTR_FLG_BUSY) + INC_CC(allctr->cpool.stat.skip_busy); + else + INC_CC(allctr->cpool.stat.skip_race); + } + else { erts_aint_t act; /* Try to fetch it... */ act = erts_smp_atomic_cmpxchg_mb(&crr->allctr, @@ -4269,6 +4294,11 @@ static struct { Eterm fail_shared; Eterm fail_pend_dealloc; Eterm fail; + Eterm skip_size; + Eterm skip_busy; + Eterm skip_not_pooled; + Eterm skip_traitor; + Eterm skip_race; #endif Eterm sbcs; @@ -4365,6 +4395,11 @@ init_atoms(Allctr_t *allctr) AM_INIT(fail_shared); AM_INIT(fail_pend_dealloc); AM_INIT(fail); + AM_INIT(skip_size); + AM_INIT(skip_busy); + AM_INIT(skip_not_pooled); + AM_INIT(skip_traitor); + AM_INIT(skip_race); #endif AM_INIT(sbcs); @@ -4675,6 +4710,25 @@ info_cpool(Allctr_t *allctr, bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.fetch)), bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.fetch))); + add_3tup(hpp, szp, &res, am.skip_size, + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.skip_size)), + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.skip_size))); + + add_3tup(hpp, szp, &res, am.skip_busy, + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.skip_busy)), + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.skip_busy))); + + add_3tup(hpp, szp, &res, am.skip_not_pooled, + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.skip_not_pooled)), + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.skip_not_pooled))); + + add_3tup(hpp, szp, &res, am.skip_traitor, + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.skip_traitor)), + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.skip_traitor))); + + add_3tup(hpp, szp, &res, am.skip_race, + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.skip_race)), + bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.skip_race))); add_2tup(hpp, szp, &res, am.carriers_size, diff --git a/erts/emulator/beam/erl_alloc_util.h b/erts/emulator/beam/erl_alloc_util.h index 2c0d7f7d75..e69b7744ce 100644 --- a/erts/emulator/beam/erl_alloc_util.h +++ b/erts/emulator/beam/erl_alloc_util.h @@ -580,6 +580,11 @@ struct Allctr_t_ { CallCounter_t fail_pend_dealloc; CallCounter_t fail; CallCounter_t fetch; + CallCounter_t skip_size; + CallCounter_t skip_busy; + CallCounter_t skip_not_pooled; + CallCounter_t skip_traitor; + CallCounter_t skip_race; } stat; } cpool; #endif -- cgit v1.2.3 From a872592f245ec8287b15c3b5c8ed1057dba48756 Mon Sep 17 00:00:00 2001 From: Sverker Eriksson Date: Mon, 13 Nov 2017 20:34:40 +0100 Subject: Do not include new stats for 'allocator_sizes' --- erts/emulator/beam/erl_alloc_util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erts/emulator/beam/erl_alloc_util.c b/erts/emulator/beam/erl_alloc_util.c index 68b365bd90..a515569794 100644 --- a/erts/emulator/beam/erl_alloc_util.c +++ b/erts/emulator/beam/erl_alloc_util.c @@ -4686,6 +4686,7 @@ info_cpool(Allctr_t *allctr, if (hpp || szp) { res = NIL; + if (!sz_only) { add_3tup(hpp, szp, &res, am.fail_pooled, bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.fail_pooled)), bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.fail_pooled))); @@ -4733,6 +4734,7 @@ info_cpool(Allctr_t *allctr, add_2tup(hpp, szp, &res, am.carriers_size, bld_unstable_uint(hpp, szp, csz)); + } if (!sz_only) add_2tup(hpp, szp, &res, am.carriers, -- cgit v1.2.3 From 374623c53c7b7f613eb9aa20deb06d7425697086 Mon Sep 17 00:00:00 2001 From: Sverker Eriksson Date: Mon, 13 Nov 2017 20:35:07 +0100 Subject: Remove duplicate stats for 'fetch' --- erts/emulator/beam/erl_alloc_util.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/erts/emulator/beam/erl_alloc_util.c b/erts/emulator/beam/erl_alloc_util.c index a515569794..d8346c4239 100644 --- a/erts/emulator/beam/erl_alloc_util.c +++ b/erts/emulator/beam/erl_alloc_util.c @@ -4746,9 +4746,6 @@ info_cpool(Allctr_t *allctr, add_2tup(hpp, szp, &res, am.blocks, bld_unstable_uint(hpp, szp, nob)); - add_3tup(hpp, szp, &res, am.fetch, - bld_unstable_uint(hpp, szp, ERTS_ALC_CC_GIGA_VAL(allctr->cpool.stat.fetch)), - bld_unstable_uint(hpp, szp, ERTS_ALC_CC_VAL(allctr->cpool.stat.fetch))); } return res; -- cgit v1.2.3 From b1d720eff3f3b59a8a5261a14728336d306ca70b Mon Sep 17 00:00:00 2001 From: Sverker Eriksson Date: Mon, 13 Nov 2017 20:36:21 +0100 Subject: Fix erlang:memory --- erts/preloaded/ebin/erlang.beam | Bin 105124 -> 105092 bytes erts/preloaded/src/erlang.erl | 5 ++--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/erts/preloaded/ebin/erlang.beam b/erts/preloaded/ebin/erlang.beam index 72898e6d8a..ae3f11cd9d 100644 Binary files a/erts/preloaded/ebin/erlang.beam and b/erts/preloaded/ebin/erlang.beam differ diff --git a/erts/preloaded/src/erlang.erl b/erts/preloaded/src/erlang.erl index 8771089b65..3abb4538dc 100644 --- a/erts/preloaded/src/erlang.erl +++ b/erts/preloaded/src/erlang.erl @@ -3713,15 +3713,14 @@ memory_is_supported() -> get_blocks_size([{blocks_size, Sz, _, _} | Rest], Acc) -> get_blocks_size(Rest, Acc+Sz); -get_blocks_size([{_, _, _, _} | Rest], Acc) -> - get_blocks_size(Rest, Acc); get_blocks_size([{blocks_size, Sz} | Rest], Acc) -> get_blocks_size(Rest, Acc+Sz); -get_blocks_size([{_, _} | Rest], Acc) -> +get_blocks_size([_ | Rest], Acc) -> get_blocks_size(Rest, Acc); get_blocks_size([], Acc) -> Acc. + blocks_size([{Carriers, SizeList} | Rest], Acc) when Carriers == mbcs; Carriers == mbcs_pool; Carriers == sbcs -> -- cgit v1.2.3