[ 
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)

Reply via email to