Skip to content

Experiments

Evan West edited this page Feb 28, 2022 · 131 revisions

Experimental Results (Final Draft)

Continuous Query Timing

stream used: kron17

No Memory Limit

Stream ingestionTerrace (sec)Aspen (sec)GZ, buffer=100 (flush, cc = total)
10%0.7237480.2944960.88, 0.86 = 1.75
20%1.322060.5186030.90, 0.48 = 1.38
30%2.001260.7350330.90, 0.48 = 1.39
40%2.545830.9291990.90, 0.51 = 1.41
50%3.05121.134090.90, 0.52 = 1.42
60%2.594271.352750.90, 0.51 = 1.41
70%2.9851.532110.90, 0.49 = 1.39
80%3.340391.792850.90, 0.48 = 1.38
90%N/A1.946580.90, 0.51 = 1.41
100%N/A2.125430.90, 0.49 = 1.39

GraphZeppelin had an insertion rate of 3,946,000 per second on this workload

Note: Terrace crashes 83% of the way through the kron17 stream.

12GB Limit

Stream ingestionTerrace (sec)Aspen (sec)GZ, buffer=standard (flush, cc = total)
10%-0.31215.6, 7.96 = 23.6
20%-0.51115.9, 8.43 = 24.4
30%-0.75716.0, 8.52 = 24.5
40%-0.90215.9, 8.45 = 24.4
50%-1.12716.0, 8.43 = 24.4
60%-1.33815.9, 8.44 = 24.4
70%-1.56015.9, 8.48 = 24.4
80%-53.8816.0, 8.47 = 24.5
90%-94.6215.9, 8.49 = 24.4
100%-142.316.0, 8.45 = 24.4

Aspen had an insertion rate of 91,670 per second
GraphZeppelin had an insertion rate of 4,147,000 per second

Sketch speed + size

Sketch Speed

This is a comparison between our initial powermod l0 sampling implementation and our current implementation. Both versions of sketching only calculate the checksum value once per column. These are vector sketches, not node sketches. (thus lgn x lgn)

Vector sizeAGM 128 bit bucketsAGM 64 bit bucketsCubeSketch
10^3121,076 updates/s221,330 updates/s7,322,360 updates/s
10^466,726 updates/s122,598 updates/s5,180,510 updates/s
10^531,635 updates/s54,956 updates/s4,384,660 updates/s
10^619,021 updates/s29,331 updates/s3,730,720 updates/s
10^713,581 updates/s20,936 updates/s3,177,070 updates/s
10^810,577 updates/s16,352 updates/s2,825,880 updates/s
10^97,390 updates/s13,200 updates/s2,587,790 updates/s
10^101,352 updates/sN/A2,272,880 updates/s
10^11916 updates/sN/A2,108,760 updates/s
10^12835 updates/sN/A1,963,690 updates/s

Sketch Size

This is a comparison between our initial powermod l0 sampling implementation and our current implementation. These are vector sketches, not node sketches.

Vector sizeAGM 128 bitAGM 64 bitCubeSketch
10^35,360B2,696B1,243B
10^410,160B5,096B2,395B
10^514,768B7,400B3,511B
10^620,240B10,136B4,843B
10^728,880B14,456B6,955B
10^836,368B18,200B8,791B
10^944,720B22,376B10,843B
10^1057,200BN/A13,915B
10^1167,568BN/A16,471B
10^1278,800BN/A19,243B

Memory + Speed Experiments

Memory

GraphZeppelin (Gutter tree with 16 GB restriction)

DatasetRES (GiB)SWAP (GiB)DISK (GiB)TOTALTOTAL w/out DISK
Kron130.7500.901.650.75
Kron156.2004.5710.776.2
Kron168.90010.2319.138.9
Kron1714.80.0522.7637.6114.85
Kron1815.512.550.4478.4428

GraphZeppelin (Leaf Only; unrestricted)

DatasetRES (GiB)SWAP (GiB)TOTAL
Kron130.5800.58
Kron153.103.1
Kron167.007.0
Kron1715.7015.7
Kron1835.1035.1

Aspen

nodesRESSWAP
81923526840
3276836507222010
6553668719476730
131072169651208191073741824
262144169651208197516192768

Terrace

nodesRESSWAP
81925577880
3276867645734910
65536170724950018375186227
1310721632087572486758339379

Speed

Restricted (16 GiB)

GraphZeppelin (Gutter Tree)
DatasetInsertions/sec (millions)CC_time (seconds)
Kron133.930.02
Kron153.770.10
Kron163.590.22
Kron173.260.44
Kron182.5097.5
GraphZeppelin (Leaf Only)
DatasetInsertions/sec (millions)CC_time (seconds)
Kron135.220.02
Kron154.870.10
Kron164.510.19
Kron174.240.42
Kron182.49103
Aspen
nodesingestion_ratecc_time
819249824000.04095
3276835405700.2022
6553625431200.746
13107218997203.11
26214411337.50
Terrace
nodesingestion_ratecc_time
81921379290.126
327681327230.8
655361432861.26
13107225538.60

Unrestricted

GraphZeppelin (GutterTree)
DatasetInsertions/sec (millions)CC_time (seconds)
Kron133.960.03
Kron153.800.10
Kron163.690.20
Kron173.730.45
Kron183.520.89
GraphZeppelin (Leaf Only)
DatasetInsertions/sec (millions)CC_time (seconds)
Kron135.360.02
Kron154.980.07
Kron164.700.19
Kron174.410.29
Kron184.270.59
NOTE: This table of results is from after the submission and includes some optimizations that are not included with the other results. They indicate the performance of the main branch of the GraphStreamingCC system as of 02/28/2022 using a queue_factor of -2.

Aspen has 1.6019 million update per second ingestion rate on kron18 unrestricted

Parallel Experiment

Total ThreadsNum_groupsGroup_sizeInsertions/sec (millions)
1110.17
4410.65
8811.28
121211.76
161612.17
202012.53
242412.98
282813.24
323213.46
363613.67
404013.88
444414.10
464614.21
Num GroupsGroup_SizeInsertions/sec (millions)
4013.89
2023.77
1043.61
4102.52
2202.59

Buffering Experiment

Memory Limited to 8 GB

Number of Updates per BufferProportion of a Sketch (%)Insertions/sec (millions)
10.00480.002
2501.20480.44
5002.40960.88
10374.99761.60
2075102.00
345816.66512.48
518724.99762.89
691633.33012.91
10375503.01
207501002.87
415002003.14

Memory 'Unlimited' (64 GB)

Number of Updates per BufferProportion of a Sketch (%)Insertions/sec (millions)
10.004819277108433730.13
2501.204819277108434.18
5002.409638554216874.24
10374.997590361445784.27
2075104.28
345816.66506024096394.27
518724.99759036144584.26
691633.33012048192774.24
10375504.21
207501004.09
415002003.89

Experimental Results (SIGMOD submission)

Click to reveal

Memory

GraphZeppelin (Gutter tree with 16 GB restriction)

DatasetRES (GiB)SWAP (GiB)DISK (GiB)TOTALTOTAL w/out DISK
Kron130.7800.561.340.78
Kron156.703.19.86.7
Kron1610.407.2517.6510.4
Kron1715.63.516.8935.9919.1
Kron1815.524.339.1778.9739.8

GraphZeppelin (Leaf Only; unrestricted)

DatasetRES (GiB)SWAP (GiB)TOTAL
Kron130.5200.52
Kron153.203.2
Kron167.707.7
Kron1718.6018.6
Kron1844.1044.1

Aspen

nodesRESSWAP
81923526840
3276836507222010
6553668719476730
131072169651208191073741824
262144169651208197516192768

Terrace

nodesRESSWAP
81925577880
3276867645734910
65536170724950018375186227
1310721632087572486758339379

Speed

Restricted

GraphZeppelin (Gutter Tree)
DatasetInsertions/sec (millions)CC_time (seconds)
Kron133.290.11
Kron152.760.53
Kron162.551.22
Kron172.0931.7
Kron181.63537
GraphZeppelin (Leaf Only)
DatasetInsertions/sec (millions)CC_time (seconds)
Kron134.510.1
Kron153.510.52
Kron163.031.21
Kron172.6748.79
Kron181.88553
Aspen
nodesingestion_ratecc_time
819249824000.04095
3276835405700.2022
6553625431200.746
13107218997203.11
26214411337.50
Terrace
nodesingestion_ratecc_time
81921379290.126
327681327230.8
655361432861.26
13107225538.60

Unrestricted

GraphZeppelin (Leaf Only)
DatasetInsertions/sec (millions)CC_time (seconds)
Kron134.510.1
Kron153.50.55
Kron163.041.21
Kron172.722.77
Kron182.436.46

Aspen has 1.6019 million update per second ingestion rate on kron18 unrestricted

Parallel Experiment

Total ThreadsNum_groupsGroup_sizeInsertions/sec (millions)
1110.11
4410.43
8810.85
121211.17
161611.44
202011.69
242411.99
282812.13
323212.27
363612.40
404012.53
444412.67
464612.74

Buffering Experiment

Memory Limited to 8 GB

Number of Updates per BufferProportion of a Sketch (%)Insertions/sec (millions)
10.00340.002
2500.84750.19
5001.69490.39
10003.38980.80
17505.93221.19
300010.16951.64
500016.94922.12
750025.42372.31
1000033.89832.39
14750502.43
295001002.41

Memory 'Unlimited' (64 GB)

Number of Updates per BufferProportion of a Sketch (%)Insertions/sec (millions)
10.00340.14
2500.84752.52
5001.69492.55
10003.38982.56
17505.93222.57
300010.16952.57
500016.94922.63
750025.42372.62
1000033.89832.61
14750502.58
295001002.53

Old experiment results (version 2)

Click to reveal

1. Sketch speed experiment

This is a comparison between our initial powermod l0 sampling implementation and our current implementation. These are vector sketches, not node sketches.

Vector size128 bit buckets64 bit bucketsxor hashing .5 bucket factor
10^3101840.357 updates/s174429.354 updates/s7156454.406 updates/s
10^455797.655 updates/s96216.757 updates/s6588353.109 updates/s
10^525971.327 updates/s45342.837 updates/s6015725.105 updates/s
10^617071.867 updates/s25876.702 updates/s5036844.517 updates/s
10^712132.933 updates/s18442.902 updates/s4407694.070 updates/s
10^89490.997 updates/s14383.936 updates/s4096379.619 updates/s
10^97652.748 updates/s11602.058 updates/s3673283.474 updates/s
10^101269.098 updates/sN/A3296869.951 updates/s
10^11912.666 updates/sN/A3146148.013 updates/s
10^12805.574 updates/sN/A2888870.913 updates/s

2. Sketch size experiment

This is a comparison between our initial powermod l0 sampling implementation and our current implementation. These are vector sketches, not node sketches.

Vector size128 bit buckets64 bit bucketsxor hashing .5 bucket factor
10^35KiB3KiB770B
10^410KiB5KiB1363B
10^514KiB7KiB1843B
10^620KiB10KiB2627B
10^728KiB14KiB3715B
10^836KiB18KiB4483B
10^944KiB22KiB5682B
10^1056KiBN/A7151B
10^1166KiBN/A7487B
10^1276KiBN/A9955B

3. Continuous correctness test

We update an adjacency matrix while giving updates to our data structure, and after a bunch of updates we pause and compare the connected components given from the adjacency matrix and from our algorithm.

In each individual run of the correctness test, we ran 100 checks over the course of the input stream.

For kron17, we repeated these runs 5 times, resulting in a total of 500 checks. We saw no failures.

For p2p-Gnutella31, we repeated these runs 5 times, resulting in a total of 500 checks. We saw no failures.

4. system speed test

SSD swapping

speed

Aspen

Input StreamOverall Throughput (updates / second)Total Ingestion Time (seconds)Total Runtime (seconds)
kron1346910803.73.8
kron1535128908080
kron162461450454455
kron17184346024272430
kron1871600*DNF after 24hrDNF after 24hr

*Insertions per second is an estimate because we killed it at the 34% complete mark.

Terrace

Input StreamOverall Throughput (updates / second)Total Ingestion Time (seconds)Total Runtime (seconds)
kron13137596127.5127.6
kron1513082621402141
kron1613720081598160
kron1733,300*DNF after 24 hoursDNF after 24 hours
kron18---------

NVMe swapping

Aspen

Input StreamOverall Throughput (updates / second)Total Ingestion Time (seconds)Total Runtime (seconds)
kron171.8333 x 10^624412443
kron18*N/ADNF after 24hrDNF after 24hr
  • Made it 34% through the stream

Terrace

Input StreamOverall Throughput (updates / second)Total Ingestion Time (seconds)Total Runtime (seconds)
kron1613814881038104
kron17*N/ADNF after 24 hoursDNF after 24 hours
  • Made it 71% through the stream

Our System

In-RAM Buffering

DatasetInsertions/sec (millions)Insertion TimeConnected Components Time
kron_133.165.6 seconds0.1 seconds
kron_152.75102 seconds0.6 seconds
kron_162.477.55 minutes1.27 seconds
kron_172.0835.9 minutes59.5 seconds
kron_181.303hr 49 minutes10.1 minutes

Gutter Tree Buffering

DatasetInsertions/sec (millions)Insertion TimeConnected Components Time
kron_132.207.98 seconds0.10 seconds
kron_151.93145.2 seconds0.56 seconds
kron_161.8410.2 minutes1.29 seconds
kron_171.7143.6 minutes55.6 seconds
kron_181.523hr 16 minutes10.9 minutes

5. System memory size test

size

Aspen

Using top logging

Input StreamRES (GiB)SWAP (GiB)
kron131.9 GB0
kron153.4 GB0
kron166.4 GB0
kron1715.9 GB1 GB
kron1815.9 GB6.3 GB

Using Aspen's own memory footprint tool:

Input GraphFully Compressed with Difference Encoding (GiB)Without Difference Encoding (GiB)Without C-Trees (GiB)
kron130.05 GB0.18 GB0.98 GB
kron150.83 GB2.94 GB15.90 GB
kron163.34 GB11.79 GB63.74 GB
kron1713.38 GB47.25 GB255.5 GB
kron18*18.49 GB64.92 GB349.7 GB

*kron18 stopped 34% through the stream.

Terrace

Input StreamRES (GiB)SWAP (GiB)
kron_130.520
kron_155.900
kron_1615.907.70
kron_1715.9031.8

kron_17 numbers are only 74% through the stream

Aspen & Terrace without Memory Restrictions

Using top logging

systeminputRES (GiB)SWAP (GiBTotal (GiB)
Aspenkron1857.7057.7
Terracekron1760.335.796.0

*Terrace only got 88% through the stream

Using aspens memory footprint tool

Input GraphFully Compressed with Difference Encoding (GiB)Without Difference Encoding (GiB)Without C-Trees (GiB)
kron1853.97 GB189.6 GB1022 GB

Our system

In-RAM Buffering

All numbers in GiB

DatasetRAM usageSwap UsageTotal
kron_130.5500.55
kron_153.3003.30
kron_168.0008.00
kron_1715.93.3019.2
kron_1815.929.745.6

Gutter Tree Buffering

DatasetRAM usageSwap UsageTotal
kron_130.7800.78
kron_156.8006.80
kron_1610.6010.6
kron_1715.74.6020.3
kron_1815.725.841.5

*These numbers don't include the size of the GutterTree file. How should we report the size of this GutterTree file?

6. Parallel test

Run upon big boi and a truncated version of kron_17 found at /home/evan/trunc_streams/kron_17_stream_trunc.txt.
There were two experiments that we ran. In the first, we varied the total number of threads available for stream ingestion from 1 to 46 while keeping a constant group_size of two. In the second, we kept a constant 40 threads but varied the group_size to see the affect on performance. In both of these experiments the full 64 GB of memory was available and we used the in-RAM buffering system.

We record the average and median insertion rate because there is a fair amount of single threaded overhead at the beginning of the stream (filling up the buffers the first time, allocating memory, creating sketches, etc.) the median should therefore provide a better indication of performance over the full kron_17 stream.

Varying Group Size

groups

Group_sizeNum_groupsInsertions/sec (millions)Median Rate (millions)
1401.412.21
2201.182.08
4101.291.95
1041.201.724
2021.181.722
4010.841.05

Varying Number of Threads

threads

Total ThreadsNum_groupsGroup_sizeInsertions/sec (millions)70th Percentile Rate (millions)
1110.100.10
4410.360.38
8810.670.76
121210.871.06
161611.011.29
202011.111.51
242411.231.79
282811.291.89
323211.322.00
363611.362.11
404011.392.22
444411.432.33
464611.442.38

TODO

  • Rerun the varying group size experiment with a constant amount of work queue. Perhaps a reduced work queue is part of why group_size=1 was always faster. Also be sure to get the median insertion rate this time.
  • If the optimal group size is not 2 then re-run the vary number of threads experiment with the optimal group_size.

7. Distributed test

8. Other Small Experiments

Buffer size reduction for in-RAM tests

How far can we reduce the size of the in-RAM buffers while maintaining comparable performance.
We run upon a truncated version of kron_18 with only 2 billion insertions. The memory was limited to 16GB and we ran with 44 graph workers each of size 1.

Buffer SizeNumber of UpdatesInsertions/sec (millions)
Full174961.09
Half87481.14
Third58321.10
Quarter43741.09
Fifth34991.04
Sixth29161.00
Tenth17490.84
1/1511660.69 (nice)
1/208740.62
1/256990.55

Buffer Size for Enabling Parallelism

The purpose of this test is to establish that buffering is necessary for parallelism to have a benefit.
We ran these tests upon the full version of kron_15 with a variety of buffer sizes.
These tests were run without a memory limitation.
TODO: Would it be better to run one of the larger graphs with a memory limitation so that we see the IO performance? Or is this just an entirely in memory concern?

Number of Updates per BufferInsertions/sec (millions)
10.16
40.68
162.02
642.45
2562.65
10242.73
40962.64
202482.15

Large Amounts of Memory Restriction In-RAM vs Gutter Tree

For kron_18 we expect the in-RAM version of our algorithm to require at least 2GB to perform well. In this experiment we will try limiting the memory to only 1GB at comparing the performance of the in-RAM buffering and Gutter Tree. We run upon a truncated version of kron_18 with only 2 billion insertions. All of these experiments were run with 44 Graph_Workers each of size 1.

SystemMemory RestrictionTotal Runtime of InsertionsInsertions/sec
In-RAMLimit to 16GB30.4 minutes1,098,110
Gutter TreeLimit to 16GB36.1 minutes922,627
In-RAMLimit to 3GB38.6 minutes863,377
Gutter TreeLimit to 3GB42.2 minutes690,923
In-RAMLimit to 1GBDNF after 9 hoursAt most 62
Gutter TreeLimit to 1GB1 hour 6.5 minutes516,737

Gutter Tree Leaf Size

In this experiment we seek to establish how big the leaves of the buffer tree need to be in order to have good performance. Larger buffer tree leaves means that the buffer tree can keep working even when the work queue is full but also we'd like these leaves to be as small as possible.
We ran this experiment upon the truncated version of kron_18, 46 Graph Workers of size 1, and with a memory restriction of 16GB.

Leaf SizeSketches per leafInsertions/sec
1 MB7.51.09 million
512 KB3.751.10 million
256 KB1.871.09 million
161 KB1*1.10 million

*the size of a sketch is actually about 137KB but we pad the size of a leaf by the size of the blocks we write to the children (24KB). The size at which we remove from the tree is 137KB still though. 137KB is how we calculated the other sketch per leaf values.

Old experiment results (version 1)

Click to reveal ## 1. Sketch speed experiment

This is a comparison between our initial powermod l0 sampling implementation and our current implementation. These are vector sketches, not node sketches.

Vector size128 bit buckets64 bit bucketsxor hashing .5 bucket factor
10^3101840.357 updates/s174429.354 updates/s7156454.406 updates/s
10^455797.655 updates/s96216.757 updates/s6588353.109 updates/s
10^525971.327 updates/s45342.837 updates/s6015725.105 updates/s
10^617071.867 updates/s25876.702 updates/s5036844.517 updates/s
10^712132.933 updates/s18442.902 updates/s4407694.070 updates/s
10^89490.997 updates/s14383.936 updates/s4096379.619 updates/s
10^97652.748 updates/s11602.058 updates/s3673283.474 updates/s
10^101269.098 updates/sN/A3296869.951 updates/s
10^11912.666 updates/sN/A3146148.013 updates/s
10^12805.574 updates/sN/A2888870.913 updates/s

2. Sketch size experiment

This is a comparison between our initial powermod l0 sampling implementation and our current implementation. These are vector sketches, not node sketches.

Vector size128 bit buckets64 bit bucketsxor hashing .5 bucket factor
10^35KiB3KiB770B
10^410KiB5KiB1363B
10^514KiB7KiB1843B
10^620KiB10KiB2627B
10^728KiB14KiB3715B
10^836KiB18KiB4483B
10^944KiB22KiB5682B
10^1056KiBN/A7151B
10^1166KiBN/A7487B
10^1276KiBN/A9955B

3. Continuous correctness test

We update an adjacency matrix while giving updates to our data structure, and after a bunch of updates we pause and compare the connected components given from the adjacency matrix and from our algorithm. We did 50 checks over the course of the kron17 stream, and did not get any discrepancies.

4. system speed test

Aspen

Input StreamOverall Throughput (updates / second)Total Ingestion Time (seconds)Total Runtime (seconds)
kron133.41272e+066.435426.45255
kron153.19362e+0692.622592.7011
kron162.99069e+06372.126372.44
kron172.91467e+061532.251533.1
kron1830329158916.759369.1

Terrace

Input StreamOverall Throughput (updates / second)Total Ingestion Time (seconds)Total Runtime (seconds)
kron13141012155.748155.807
kron151358922176.732177.15
kron161280408691.98693.32
kron1761905.572142.472232

Note: Terrace crashed on kron18 around the 16 hour mark


Our System

In-RAM Buffering

DatasetInsertions/sec (millions)Insertion TimeConnected Components Time
kron_132.488.8 seconds0.1 seconds
kron_152.21134 seconds0.5 seconds
kron_161.989.3 minutes1.3 seconds
kron_171.7143.5 minutes149 seconds
kron_181.214.1 hours10.4 minutes

Gutter Tree Buffering

DatasetInsertions/sec (millions)Insertion TimeConnected Components Time
kron_132.598.4 seconds0.1 seconds
kron_152.33127 seconds0.6 seconds
kron_161.879.9 minutes1.3 seconds
kron_171.2459.9 minutes44.8 seconds
kron_180.955.2 hours11.7 minutes

TODO

  • See if Gutter Tree performance can be improved (is sharing the same disk as the swap causing the problem?, would it be helpful to have multiple threads inserting to the tree?).

5. System memory size test

Aspen

Using top logging

Input StreamRES (GiB)SWAP (GiB)
kron132.40
kron152.80
kron164.10
kron177.30
kron1815.712.6

Using Aspen's own memory footprint tool:

Input GraphWithout C-Trees (GiB)Without Difference Encoding (GiB)Fully Compressed with Difference Encoding (GiB)
kron131.1040.20530.05725
kron1515.182.8020.7875
kron1657.2610.582.991
kron1712823.726.711

TODO: Convert kron17 and kron18 to adj format and run Aspen's memory footprint tool on these as well.

Terrace

Input StreamRES (GiB)SWAP (GiB)
kron130.5770
kron156.00
kron1615.97.8
kron1715.933.3
kron18*15.650.1

*Last numbers reported by top before Terrace crashed around the 16 hour mark.


Our system

In-RAM Buffering

DatasetRAM usageSwap UsageTotal
kron_130.80 GB0 B0.80 GB
kron_155.1 GB0 B5.1 GB
kron_1612.5 GB0 B12.5 GB
kron_1715.9 GB18.6 GB34.5 GB
kron_1815.6 GB61.8 GB77.4 GB

Gutter Tree Buffering

DatasetRAM usageSwap UsageTotal
kron_131.3 GB0 B1.3 GB
kron_156.9 GB0 B6.9 GB
kron_1610.7 GB0 B10.7 GB
kron_1715.7 GB4.7 GB20.4 GB
kron_1815.6 GB25.7 GB41.3 GB

6. Parallel test

Run upon big boi and a truncated version of kron_17 found at /home/evan/trunc_streams/kron_17_stream_trunc.txt.
There were two experiments that we ran. In the first, we varied the total number of threads available for stream ingestion from 1 to 46 while keeping a constant group_size of two. In the second, we kept a constant 40 threads but varied the group_size to see the affect on performance. In both of these experiments the full 64 GB of memory was available and we used the in-RAM buffering system.

We record the average and median insertion rate because there is a fair amount of single threaded overhead at the beginning of the stream (filling up the buffers the first time, allocating memory, creating sketches, etc.) the median should therefore provide a better indication of performance over the full kron_17 stream.

Varying Group Size

Group_sizeNum_groupsInsertions/sec (millions)
1401.42
2201.35
4101.32
1041.22
2021.20
4010.85

Varying Number of Threads

Total ThreadsGroup_sizeNum_groupsInsertions/sec (millions)Median Rate (millions)
1110.100.10
4220.340.36
8420.640.71
12620.830.99
16820.971.22
201021.091.43
241221.201.69
281421.231.75
321621.281.90
361821.321.98
402021.362.09
442221.412.23
462321.422.27

TODO

  • Rerun the varying group size experiment with a constant amount of work queue. Perhaps a reduced work queue is part of why group_size=1 was always faster. Also be sure to get the median insertion rate this time.
  • If the optimal group size is not 2 then re-run the vary number of threads experiment with the optimal group_size.

7. Distributed test

8. Other Small Experiments

Buffer size reduction for in-RAM tests

How far can we reduce the size of the in-RAM buffers while maintaining comparable performance.
We run upon a truncated version of kron_18 with only 2 billion insertions. The memory was limited to 16GB and we ran with 44 graph workers each of size 1.

Buffer SizeNumber of UpdatesInsertions/sec (millions)
Full349921.28
Half174941.44
Third116641.43
Quarter87481.40
Sixth58321.27
Eighth43721.17
Tenth34981.08

Buffer Size for Enabling Parallelism

The purpose of this test is to establish that buffering is necessary for parallelism to have a benefit.
We ran these tests upon the full version of kron_15 with a variety of buffer sizes.
These tests were run without a memory limitation.
TODO: Would it be better to run one of the larger graphs with a memory limitation so that we see the IO performance? Or is this just an entirely in memory concern?

Number of Updates per BufferInsertions/sec (millions)
10.15
40.61
161.87
642.45
2562.70
10242.66
40962.41

Large Amounts of Memory Restriction In-RAM vs Gutter Tree

For kron_18 we expect the in-RAM version of our algorithm to require at least 2GB to perform well. In this experiment we will try limiting the memory to only 1GB at comparing the performance of the in-RAM buffering and Gutter Tree. We run upon a truncated version of kron_18 with only 2 billion insertions. All of these experiments were run with 44 Graph_Workers each of size 1.

SystemMemory RestrictionTotal Runtime of InsertionsInsertions/sec
In-RAMLimit to 16GB30.4 minutes1,098,110
Gutter TreeLimit to 16GB36.1 minutes922,627
In-RAMLimit to 3GB38.6 minutes863,377
Gutter TreeLimit to 3GB42.2 minutes690,923
In-RAMLimit to 1GBDNF after 9 hoursAt most 62
Gutter TreeLimit to 1GB1 hour 6.5 minutes516,737

Gutter Tree Leaf Size

In this experiment we seek to establish how big the leaves of the buffer tree need to be in order to have good performance. Larger buffer tree leaves means that the buffer tree can keep working even when the work queue is full but also we'd like these leaves to be as small as possible.
We ran this experiment upon the truncated version of kron_18, 46 Graph Workers of size 1, and with a memory restriction of 16GB.

Leaf SizeSketches per leafInsertions/sec
1 MB7.51.09 million
512 KB3.751.10 million
256 KB1.871.09 million
161 KB1*1.10 million

*the size of a sketch is actually about 137KB but we pad the size of a leaf by the size of the blocks we write to the children (24KB). The size at which we remove from the tree is 137KB still though. 137KB is how we calculated the other sketch per leaf values.

TODO

  • Buffer size experiment to show that a large-ish buffer is necessary for parallelism.
  • Faster queries via multi-threading?

Old experiment notes

Click to reveal ## !!DATASET LOCATIONS!! - Graphs and streams can be found in /home/experiment_inputs on big boi. - Static input graphs in edge-list format may be found in /home/experiment_inputs/graphs. - Streams from these input graphs may be found in /home/experiment_inputs/streams. - UPDATE: Needed to regenerate streams due to an off-by-one error. Only kron_17 is yet unfinished.

1. Continuous correctness test

Give the algorithm a stream defining a graph. Every X stream updates, pause the stream and run the post-processing algorithm. Make sure there are no random failures and then continue. This will show that our algorithm's failure probability is very low (basically unobservable) in practice. We compare against an ultra-compact data structure which Kenny will write.

Dataset: Kronecker with 1/4 max density on 100K nodes. Ahmed will generate this and streamify it.

Algorithm to run: Our core alg using in-memory buffering (there should be more than enough space).

Challenges: Under normal circumstances, running our alg on a stream this size should be fairly fast (prob < 1 hr). But since we have to keep stopping, flushing all buffers, processing flushed updates which may not be very parallel, and then doing connected components, this could take a long time.

What needs doing?

  • in-memory buffering needs to be completed. in pull request, evan and/or kenny will check ASAP -- Done

  • we need to generate and streamify the dataset. done

  • half reps needs to be enabled on the branch that is testing this. Evan will do. -- Done

  • it needs to have all of our bells and whistles that make things faster. evan did it already

  • kenny is going to add some sketch copying functionality to rewind sketch smushing. done.

  • we should test on a small prefix of the stream to see how long this will take. based on that we can decide how many data points we want for the experiment, if we have to do fewer queries and augment with more tests on smaller graphs, etc. kenny will do this on old machine

  • Run the actual test!

2. Speed Test

Run our algorithm (internal and external) and 1 or 2 in-memory dynamic graph systems and compare their performance as graph sizes grow larger. Ligra, Aspen, Terrace are likely targets. No correctness testing required.

Datasets: nearly full-density graphs on 10K, 50K, 100K, 200K nodes. Generated with both Kronecker and Erdos-Renyi if we have enough time to run on both. They need to be generated and streamified.

Algorithms to run: Aspen, Terrace and our algorithm with in-mem buffering and WOD buffering. Maybe also Ligra but it is a static graph system so it may not be applicable.

Challenge: weirdness that I still don't totally understand about how our system uses disk. Does the program think that everything is in memory and the OS just swaps things to disk if the data structures are too large? Is there a way to force it to put buffer tree on disk rather than our sketches when it has to swap, assuming there's enough space for sketches?

What needs doing?

  • in-memory buffering stuff. in pull request. -- Done

  • buffer tree finishing touches, particularly basement nodes and new graph worker scheme (circular queue) / sketches on disk(Probably done, ask victor) needs to be completed. EVAN SAYS just use smaller leaves, this change is in pull request. -- All done

  • Need to make Terrace ready to accept our graph streams and only do connected components at the end.

  • get aspen running, figure out aspen batching issue

  • are input streams generated and streamified?

  • buy and set up disk hardware so systems can page to disk - hardware is shipping soon.

  • Estimate size of our data structures and aspen/terrace so we know when to expect us to start doing better. once they page to disk, they might be really bad. if so, do we have to run them for a long time? maybe we stop them after 24h? but this means locking up our machines for a long time.

  • Run the experiments.

  • victor will incorporate the memtest stuff into a new branch and make a few changes to it to automate finding PID etc

  • evan will incorporate other important components into that branch

  • limit mem to 16GB, run the experiments and see what the results are

  • try running aspen and terrace and see when they start doing poorly

  • based on results we may adjust memory size or use larger inputs, change our stream generation to make the graph denser at some points during the stream

3. Memory use test

We need to verify that our algorithm uses the (small) amount of space we expect it to. Basically we run the algorithm and chart its memory use over time. This may need to be done on a big graph at least once to make the point that memory usage is not dependent on graph size. This could be mixed with experiment 2.

Datasets: same as experiment 2.

What needs doing?

  • Victor set up a memtest tool which is lightweight enough that we can run this during the speedtest.
  • Run the experiments. This one should be pretty straightforward after the work we did setting up experiment 2.

4. Parallelizability

Show that our stream ingestion goes faster when we're given more cores. We don't need to do this for a full graph stream, just a significant portion of one so we can see the speedups. Evan has basically already made this I think.

Datasets: probably we can just do that for 1 or 2 graphs at around 100K nodes. One of the graphs we used for earlier tests. Not sure what's the best choice yet.

What needs doing?

  • Experiment DONE. We may want to run a similar experiment on a system with more cores if we can get access to one and have the time.

5. Distributed Version

We need to finish the implementation (Tyler) and get the cluster set up on as many nodes as Mike Fergman will give us (Abi). Tyler will run pilot experiments and we'll figure out what to do based on their results.

Clone this wiki locally