[
https://issues.apache.org/jira/browse/CASSANDRA-7546?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14069059#comment-14069059
]
graham sanderson commented on CASSANDRA-7546:
---------------------------------------------
FYI here are the same synthetic test results for 7546.20_2.txt
{code}
[junit] --------------------------------------------------
[junit] 1 THREAD; ELEMENT SIZE 64
[junit]
[junit] Threads = 1 elements = 100000 (of size 64) partitions = 1
[junit] original code:
[junit] Duration = 993ms maxConcurrency = 1
[junit] GC for PS Scavenge: 34 ms for 3 collections
[junit] Approx allocation = 553MB vs 8MB; ratio to raw data size =
69.13799428571429
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 761ms maxConcurrency = 1
[junit] GC for PS Scavenge: 34 ms for 3 collections
[junit] Approx allocation = 579MB vs 8MB; ratio to raw data size =
72.31675047619048
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit]
[junit] Threads = 1 elements = 100000 (of size 64) partitions = 16
[junit] original code:
[junit] Duration = 780ms maxConcurrency = 1
[junit] GC for PS Scavenge: 25 ms for 2 collections
[junit] Approx allocation = 436MB vs 8MB; ratio to raw data size =
54.48992095238095
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 671ms maxConcurrency = 1
[junit] GC for PS Scavenge: 24 ms for 2 collections
[junit] Approx allocation = 477MB vs 8MB; ratio to raw data size =
59.545997142857146
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit]
[junit] Threads = 1 elements = 100000 (of size 64) partitions = 256
[junit] original code:
[junit] Duration = 452ms maxConcurrency = 1
[junit] GC for PS Scavenge: 11 ms for 1 collections
[junit] Approx allocation = 321MB vs 8MB; ratio to raw data size =
40.14510761904762
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 460ms maxConcurrency = 1
[junit] GC for PS Scavenge: 10 ms for 1 collections
[junit] Approx allocation = 341MB vs 8MB; ratio to raw data size =
42.63770857142857
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit]
[junit] Threads = 1 elements = 100000 (of size 64) partitions = 1024
[junit] original code:
[junit] Duration = 462ms maxConcurrency = 1
[junit] GC for PS Scavenge: 14 ms for 1 collections
[junit] Approx allocation = 264MB vs 8MB; ratio to raw data size =
32.99879142857143
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 543ms maxConcurrency = 1
[junit] GC for PS Scavenge: 14 ms for 1 collections
[junit] Approx allocation = 272MB vs 8MB; ratio to raw data size =
34.047360952380956
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit]
[junit] --------------------------------------------------
[junit] 100 THREADS; ELEMENT SIZE 64
[junit]
[junit] Threads = 100 elements = 100000 (of size 64) partitions = 1
[junit] original code:
[junit] Duration = 2318ms maxConcurrency = 100
[junit] GC for PS Scavenge: 119 ms for 32 collections
[junit] Approx allocation = 10547MB vs 8MB; ratio to raw data size =
1316.62704
[junit] loopRatio (closest to 1 best) 18.35448 raw 100000/1835448 counted
0/0 sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 1315ms maxConcurrency = 100
[junit] GC for PS Scavenge: 14 ms for 1 collections
[junit] Approx allocation = 629MB vs 8MB; ratio to raw data size =
78.62949142857143
[junit] loopRatio (closest to 1 best) 1.11563 raw 13653/13653 counted 0/0
sync 88223/97910 up 0 down 0
[junit]
[junit]
[junit] Threads = 100 elements = 100000 (of size 64) partitions = 16
[junit] original code:
[junit] Duration = 215ms maxConcurrency = 100
[junit] GC for PS Scavenge: 23 ms for 2 collections
[junit] Approx allocation = 776MB vs 8MB; ratio to raw data size =
96.92138285714286
[junit] loopRatio (closest to 1 best) 1.95927 raw 100000/195927 counted
0/0 sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 201ms maxConcurrency = 99
[junit] GC for PS Scavenge: 9 ms for 1 collections
[junit] Approx allocation = 530MB vs 8MB; ratio to raw data size =
66.21505238095239
[junit] loopRatio (closest to 1 best) 1.26719 raw 72820/72820 counted 0/0
sync 49837/53899 up 0 down 0
[junit]
[junit]
[junit] Threads = 100 elements = 100000 (of size 64) partitions = 256
[junit] original code:
[junit] Duration = 187ms maxConcurrency = 96
[junit] GC for PS Scavenge: 15 ms for 1 collections
[junit] Approx allocation = 319MB vs 8MB; ratio to raw data size =
39.93250857142857
[junit] loopRatio (closest to 1 best) 1.01989 raw 100000/101989 counted
0/0 sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 188ms maxConcurrency = 99
[junit] GC for PS Scavenge: 12 ms for 1 collections
[junit] Approx allocation = 327MB vs 8MB; ratio to raw data size =
40.83917619047619
[junit] loopRatio (closest to 1 best) 1.01869 raw 99963/99963 counted 0/0
sync 1877/1906 up 0 down 0
[junit]
[junit]
[junit] Threads = 100 elements = 100000 (of size 64) partitions = 1024
[junit] original code:
[junit] Duration = 169ms maxConcurrency = 98
[junit] Approx allocation = 274MB vs 8MB; ratio to raw data size =
34.27162761904762
[junit] loopRatio (closest to 1 best) 1.00376 raw 100000/100376 counted
0/0 sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 180ms maxConcurrency = 98
[junit] GC for PS Scavenge: 13 ms for 1 collections
[junit] Approx allocation = 278MB vs 8MB; ratio to raw data size =
34.80582571428572
[junit] loopRatio (closest to 1 best) 1.00348 raw 99999/99999 counted 0/0
sync 349/349 up 0 down 0
[junit]
[junit]
[junit] --------------------------------------------------
[junit] 1 THREAD; ELEMENT SIZE 256
[junit]
[junit] Threads = 1 elements = 100000 (of size 256) partitions = 1
[junit] original code:
[junit] Duration = 735ms maxConcurrency = 1
[junit] GC for PS Scavenge: 26 ms for 2 collections
[junit] Approx allocation = 553MB vs 26MB; ratio to raw data size =
21.025497101449275
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 384ms maxConcurrency = 1
[junit] GC for PS Scavenge: 24 ms for 2 collections
[junit] Approx allocation = 556MB vs 26MB; ratio to raw data size =
21.123911594202898
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit]
[junit] Threads = 1 elements = 100000 (of size 256) partitions = 16
[junit] original code:
[junit] Duration = 329ms maxConcurrency = 1
[junit] GC for PS Scavenge: 10 ms for 1 collections
[junit] Approx allocation = 448MB vs 26MB; ratio to raw data size =
17.03236608695652
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 324ms maxConcurrency = 1
[junit] GC for PS Scavenge: 9 ms for 1 collections
[junit] Approx allocation = 449MB vs 26MB; ratio to raw data size =
17.06260608695652
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit]
[junit] Threads = 1 elements = 100000 (of size 256) partitions = 256
[junit] original code:
[junit] Duration = 692ms maxConcurrency = 1
[junit] GC for PS Scavenge: 14 ms for 1 collections
[junit] Approx allocation = 339MB vs 26MB; ratio to raw data size =
12.898537971014493
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 681ms maxConcurrency = 1
[junit] GC for PS Scavenge: 13 ms for 1 collections
[junit] Approx allocation = 338MB vs 26MB; ratio to raw data size =
12.876152753623188
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit]
[junit] Threads = 1 elements = 100000 (of size 256) partitions = 1024
[junit] original code:
[junit] Duration = 484ms maxConcurrency = 1
[junit] GC for PS Scavenge: 14 ms for 1 collections
[junit] Approx allocation = 282MB vs 26MB; ratio to raw data size =
10.73973768115942
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 463ms maxConcurrency = 1
[junit] GC for PS Scavenge: 14 ms for 1 collections
[junit] Approx allocation = 282MB vs 26MB; ratio to raw data size =
10.74182811594203
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit]
[junit] --------------------------------------------------
[junit] 100 THREADS; ELEMENT SIZE 256
[junit]
[junit] Threads = 100 elements = 100000 (of size 256) partitions = 1
[junit] original code:
[junit] Duration = 2231ms maxConcurrency = 100
[junit] GC for PS Scavenge: 121 ms for 33 collections
[junit] Approx allocation = 10752MB vs 26MB; ratio to raw data size =
408.504135942029
[junit] loopRatio (closest to 1 best) 18.49143 raw 100000/1849143 counted
0/0 sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 1330ms maxConcurrency = 100
[junit] GC for PS Scavenge: 32 ms for 2 collections
[junit] Approx allocation = 587MB vs 26MB; ratio to raw data size =
22.319155362318842
[junit] loopRatio (closest to 1 best) 1.12889 raw 16479/16479 counted 0/0
sync 85804/96410 up 0 down 0
[junit]
[junit]
[junit] Threads = 100 elements = 100000 (of size 256) partitions = 16
[junit] original code:
[junit] Duration = 227ms maxConcurrency = 99
[junit] GC for PS Scavenge: 25 ms for 2 collections
[junit] Approx allocation = 752MB vs 26MB; ratio to raw data size =
28.593344057971013
[junit] loopRatio (closest to 1 best) 1.82137 raw 100000/182137 counted
0/0 sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 204ms maxConcurrency = 98
[junit] GC for PS Scavenge: 10 ms for 1 collections
[junit] Approx allocation = 552MB vs 26MB; ratio to raw data size =
21.00069768115942
[junit] loopRatio (closest to 1 best) 1.26846 raw 72715/72715 counted 0/0
sync 49948/54131 up 0 down 0
[junit]
[junit]
[junit] Threads = 100 elements = 100000 (of size 256) partitions = 256
[junit] original code:
[junit] Duration = 180ms maxConcurrency = 94
[junit] GC for PS Scavenge: 13 ms for 1 collections
[junit] Approx allocation = 351MB vs 26MB; ratio to raw data size =
13.347453333333334
[junit] loopRatio (closest to 1 best) 1.01903 raw 100000/101903 counted
0/0 sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 178ms maxConcurrency = 97
[junit] GC for PS Scavenge: 13 ms for 1 collections
[junit] Approx allocation = 350MB vs 26MB; ratio to raw data size =
13.320123768115941
[junit] loopRatio (closest to 1 best) 1.0193 raw 99954/99954 counted 0/0
sync 1957/1976 up 0 down 0
[junit]
[junit]
[junit] Threads = 100 elements = 100000 (of size 256) partitions = 1024
[junit] original code:
[junit] Duration = 179ms maxConcurrency = 99
[junit] GC for PS Scavenge: 13 ms for 1 collections
[junit] Approx allocation = 292MB vs 26MB; ratio to raw data size =
11.113111884057972
[junit] loopRatio (closest to 1 best) 1.00393 raw 100000/100393 counted
0/0 sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 178ms maxConcurrency = 93
[junit] GC for PS Scavenge: 13 ms for 1 collections
[junit] Approx allocation = 293MB vs 26MB; ratio to raw data size =
11.15906231884058
[junit] loopRatio (closest to 1 best) 1.00396 raw 99997/99997 counted 0/0
sync 398/399 up 0 down 0
[junit]
[junit]
[junit] --------------------------------------------------
[junit] 1 THREAD; ELEMENT SIZE 1024
[junit]
[junit] Threads = 1 elements = 100000 (of size 1024) partitions = 1
[junit] original code:
[junit] Duration = 997ms maxConcurrency = 1
[junit] GC for PS Scavenge: 30 ms for 2 collections
[junit] Approx allocation = 586MB vs 99MB; ratio to raw data size =
5.885971954022988
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 836ms maxConcurrency = 1
[junit] GC for PS Scavenge: 42 ms for 3 collections
[junit] Approx allocation = 623MB vs 99MB; ratio to raw data size =
6.264844827586207
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit]
[junit] Threads = 1 elements = 100000 (of size 1024) partitions = 16
[junit] original code:
[junit] Duration = 600ms maxConcurrency = 1
[junit] GC for PS Scavenge: 28 ms for 2 collections
[junit] Approx allocation = 508MB vs 99MB; ratio to raw data size =
5.104469731800767
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 572ms maxConcurrency = 1
[junit] GC for PS Scavenge: 26 ms for 2 collections
[junit] Approx allocation = 513MB vs 99MB; ratio to raw data size =
5.159989042145594
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit]
[junit] Threads = 1 elements = 100000 (of size 1024) partitions = 256
[junit] original code:
[junit] Duration = 413ms maxConcurrency = 1
[junit] GC for PS Scavenge: 25 ms for 2 collections
[junit] Approx allocation = 440MB vs 99MB; ratio to raw data size =
4.425642222222222
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 368ms maxConcurrency = 1
[junit] GC for PS Scavenge: 27 ms for 2 collections
[junit] Approx allocation = 393MB vs 99MB; ratio to raw data size =
3.948129195402299
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit]
[junit] Threads = 1 elements = 100000 (of size 1024) partitions = 1024
[junit] original code:
[junit] Duration = 296ms maxConcurrency = 1
[junit] GC for PS Scavenge: 27 ms for 2 collections
[junit] Approx allocation = 343MB vs 99MB; ratio to raw data size =
3.4517041379310345
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 550ms maxConcurrency = 1
[junit] GC for PS Scavenge: 35 ms for 2 collections
[junit] Approx allocation = 343MB vs 99MB; ratio to raw data size =
3.4461845977011496
[junit] loopRatio (closest to 1 best) 1.0 raw 100000/100000 counted 0/0
sync 0/0 up 0 down 0
[junit]
[junit]
[junit] --------------------------------------------------
[junit] 100 THREADS; ELEMENT SIZE 1024
[junit]
[junit] Threads = 100 elements = 100000 (of size 1024) partitions = 1
[junit] original code:
[junit] Duration = 2343ms maxConcurrency = 100
[junit] GC for PS Scavenge: 143 ms for 38 collections
[junit] Approx allocation = 12065MB vs 99MB; ratio to raw data size =
121.18560452107279
[junit] loopRatio (closest to 1 best) 18.22144 raw 100000/1822144 counted
0/0 sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 1238ms maxConcurrency = 100
[junit] GC for PS Scavenge: 31 ms for 2 collections
[junit] Approx allocation = 569MB vs 99MB; ratio to raw data size =
5.7199810727969345
[junit] loopRatio (closest to 1 best) 1.11326 raw 13522/13522 counted 0/0
sync 88452/97804 up 0 down 0
[junit]
[junit]
[junit] Threads = 100 elements = 100000 (of size 1024) partitions = 16
[junit] original code:
[junit] Duration = 235ms maxConcurrency = 100
[junit] GC for PS Scavenge: 35 ms for 3 collections
[junit] Approx allocation = 792MB vs 99MB; ratio to raw data size =
7.96215540229885
[junit] loopRatio (closest to 1 best) 1.79828 raw 100000/179828 counted
0/0 sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 228ms maxConcurrency = 100
[junit] GC for PS Scavenge: 30 ms for 2 collections
[junit] Approx allocation = 618MB vs 99MB; ratio to raw data size =
6.211963754789272
[junit] loopRatio (closest to 1 best) 1.26855 raw 75427/75427 counted 0/0
sync 47424/51428 up 0 down 0
[junit]
[junit]
[junit] Threads = 100 elements = 100000 (of size 1024) partitions = 256
[junit] original code:
[junit] Duration = 189ms maxConcurrency = 98
[junit] GC for PS Scavenge: 12 ms for 1 collections
[junit] Approx allocation = 421MB vs 99MB; ratio to raw data size =
4.237997701149426
[junit] loopRatio (closest to 1 best) 1.01838 raw 100000/101838 counted
0/0 sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 199ms maxConcurrency = 98
[junit] GC for PS Scavenge: 30 ms for 2 collections
[junit] Approx allocation = 405MB vs 99MB; ratio to raw data size =
4.073938620689655
[junit] loopRatio (closest to 1 best) 1.01976 raw 99960/99960 counted 0/0
sync 2000/2016 up 0 down 0
[junit]
[junit]
[junit] Threads = 100 elements = 100000 (of size 1024) partitions = 1024
[junit] original code:
[junit] Duration = 195ms maxConcurrency = 100
[junit] GC for PS Scavenge: 32 ms for 2 collections
[junit] Approx allocation = 356MB vs 99MB; ratio to raw data size =
3.577380153256705
[junit] loopRatio (closest to 1 best) 1.00401 raw 100000/100401 counted
0/0 sync 0/0 up 0 down 0
[junit]
[junit] modified code:
[junit] Duration = 197ms maxConcurrency = 96
[junit] GC for PS Scavenge: 31 ms for 2 collections
[junit] Approx allocation = 352MB vs 99MB; ratio to raw data size =
3.538006283524904
[junit] loopRatio (closest to 1 best) 1.00377 raw 99999/99999 counted 0/0
sync 376/378 up 0 down 0
{code}
> AtomicSortedColumns.addAllWithSizeDelta has a spin loop that allocates memory
> -----------------------------------------------------------------------------
>
> Key: CASSANDRA-7546
> URL: https://issues.apache.org/jira/browse/CASSANDRA-7546
> Project: Cassandra
> Issue Type: Bug
> Components: Core
> Reporter: graham sanderson
> Assignee: graham sanderson
> Attachments: 7546.20.txt, 7546.20_2.txt, 7546.20_alt.txt,
> suggestion1.txt, suggestion1_21.txt
>
>
> In order to preserve atomicity, this code attempts to read, clone/update,
> then CAS the state of the partition.
> Under heavy contention for updating a single partition this can cause some
> fairly staggering memory growth (the more cores on your machine the worst it
> gets).
> Whilst many usage patterns don't do highly concurrent updates to the same
> partition, hinting today, does, and in this case wild (order(s) of magnitude
> more than expected) memory allocation rates can be seen (especially when the
> updates being hinted are small updates to different partitions which can
> happen very fast on their own) - see CASSANDRA-7545
> It would be best to eliminate/reduce/limit the spinning memory allocation
> whilst not slowing down the very common un-contended case.
--
This message was sent by Atlassian JIRA
(v6.2#6252)