@unitpad/modules 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +34 -2
- package/modules/availability.nbt +66 -0
- package/modules/capacity.nbt +67 -0
- package/modules/cost.nbt +74 -0
- package/modules/count.nbt +18 -0
- package/modules/latency/hardware.nbt +70 -0
- package/modules/latency/llm.nbt +98 -0
- package/modules/latency/network.nbt +74 -0
- package/modules/latency/service.nbt +67 -0
- package/modules/latency.nbt +72 -0
- package/modules/size.nbt +84 -0
- package/modules/throughput/aws.nbt +86 -0
- package/modules/throughput/db.nbt +97 -0
- package/modules/throughput/s3.nbt +44 -0
- package/modules/throughput/service.nbt +40 -0
- package/modules/throughput/storage.nbt +117 -0
- package/modules/throughput.nbt +74 -0
- package/modules/units/systems/aws.nbt +21 -0
- package/modules/units/systems/compute.nbt +21 -0
- package/modules/units/systems/network.nbt +11 -0
- package/modules/units/systems/storage.nbt +21 -0
- package/modules/units/systems/workload.nbt +51 -0
- package/modules/units/systems.nbt +13 -0
- package/package.json +62 -4
- package/unitpad.json +35 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Latency numbers every programmer should know
|
|
2
|
+
# Jeff Dean / Peter Norvig — gist.github.com/jboner/2841832 (~2012)
|
|
3
|
+
# Kept verbatim as the classic reference. Several values are 2012 hardware and
|
|
4
|
+
# disagree with the 2026 throughput modules by 4-14x (memory, SSD, disk reads);
|
|
5
|
+
# for current hardware use latency::hardware, for geography use latency::network.
|
|
6
|
+
# Import with: use latency then use the latency_* values
|
|
7
|
+
# title: Latency (classic)
|
|
8
|
+
# checked: unverified
|
|
9
|
+
# description: Jeff Dean / Peter Norvig latency numbers, verbatim (~2012)
|
|
10
|
+
# source: https://gist.github.com/jboner/2841832
|
|
11
|
+
|
|
12
|
+
# highlight: L1
|
|
13
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
14
|
+
@description("L1 cache reference")
|
|
15
|
+
let latency_l1_cache = 0.5 ns
|
|
16
|
+
|
|
17
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
18
|
+
@description("Branch mispredict")
|
|
19
|
+
let latency_branch_mispredict = 5 ns
|
|
20
|
+
|
|
21
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
22
|
+
@description("L2 cache reference (14× L1)")
|
|
23
|
+
let latency_l2_cache = 7 ns
|
|
24
|
+
|
|
25
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
26
|
+
@description("Mutex lock / unlock")
|
|
27
|
+
let latency_mutex_lock = 25 ns
|
|
28
|
+
|
|
29
|
+
# highlight: memory
|
|
30
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
31
|
+
@description("Main memory reference (20× L2, 200× L1)")
|
|
32
|
+
let latency_main_memory = 100 ns
|
|
33
|
+
|
|
34
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
35
|
+
@description("Compress 1 KB with Zippy")
|
|
36
|
+
let latency_compress_1kb = 3 us
|
|
37
|
+
|
|
38
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
39
|
+
@description("Send 1 KB over a 1 Gbps network")
|
|
40
|
+
let latency_send_1kb_1gbps = 10 us
|
|
41
|
+
|
|
42
|
+
# highlight: SSD 4K
|
|
43
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
44
|
+
@description("Read 4 KB randomly from SSD (~1 GB/s)")
|
|
45
|
+
let latency_read_4kb_ssd = 150 us
|
|
46
|
+
|
|
47
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
48
|
+
@description("Read 1 MB sequentially from memory")
|
|
49
|
+
let latency_read_1mb_memory = 250 us
|
|
50
|
+
|
|
51
|
+
# highlight: DC RTT
|
|
52
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
53
|
+
@description("Round trip within the same datacenter")
|
|
54
|
+
let latency_datacenter_roundtrip = 500 us
|
|
55
|
+
|
|
56
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
57
|
+
@description("Read 1 MB sequentially from SSD (~1 GB/s, 4× memory)")
|
|
58
|
+
let latency_read_1mb_ssd = 1 ms
|
|
59
|
+
|
|
60
|
+
# highlight: disk seek
|
|
61
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
62
|
+
@description("Disk seek (20× datacenter round trip)")
|
|
63
|
+
let latency_disk_seek = 10 ms
|
|
64
|
+
|
|
65
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
66
|
+
@description("Read 1 MB sequentially from disk (80× memory, 20× SSD)")
|
|
67
|
+
let latency_read_1mb_disk = 20 ms
|
|
68
|
+
|
|
69
|
+
# highlight: CA→NL
|
|
70
|
+
@url("https://gist.github.com/jboner/2841832")
|
|
71
|
+
@description("Send a packet California → Netherlands → California")
|
|
72
|
+
let latency_send_packet_ca_nl_ca = 150 ms
|
package/modules/size.nbt
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Data sizes, overheads and ratios, plus platform size caps
|
|
2
|
+
# Import with: use size then use the size_* values
|
|
3
|
+
# title: Size
|
|
4
|
+
# checked: unverified
|
|
5
|
+
# description: IDs, packet overheads, media bitrates, compression ratios, replication overheads and platform size caps (max/min)
|
|
6
|
+
# vendor: aws
|
|
7
|
+
|
|
8
|
+
# --- Identifiers and records ---
|
|
9
|
+
@url("https://www.rfc-editor.org/rfc/rfc9562")
|
|
10
|
+
@description("UUID, binary (128 bits; 36 bytes as a hyphenated string)")
|
|
11
|
+
let size_uuid = 16 B
|
|
12
|
+
|
|
13
|
+
@url("https://en.wikipedia.org/wiki/64-bit_computing")
|
|
14
|
+
@description("64-bit integer / timestamp / Snowflake-style ID")
|
|
15
|
+
let size_int64 = 8 B
|
|
16
|
+
|
|
17
|
+
# --- Network framing ---
|
|
18
|
+
@url("https://en.wikipedia.org/wiki/Maximum_transmission_unit")
|
|
19
|
+
@description("Ethernet MTU (1,500 B payload; 9,001 B jumbo frames inside AWS VPCs)")
|
|
20
|
+
let size_mtu = 1500 B
|
|
21
|
+
|
|
22
|
+
@url("https://www.rfc-editor.org/rfc/rfc9293")
|
|
23
|
+
@description("IPv4 + TCP headers without options (20 + 20 B; ~52 B with common TCP options)")
|
|
24
|
+
let size_tcp_ip_header = 40 B
|
|
25
|
+
|
|
26
|
+
# --- Media bitrates (YouTube upload recommendations, SDR, 24-30 fps) ---
|
|
27
|
+
# highlight: 1080p
|
|
28
|
+
@url("https://support.google.com/youtube/answer/1722171")
|
|
29
|
+
@description("1080p video bitrate (8 Mbps upload recommendation; delivered streams are often 3-6 Mbps)")
|
|
30
|
+
let size_video_1080p = 8 Mbit/s
|
|
31
|
+
|
|
32
|
+
@url("https://support.google.com/youtube/answer/1722171")
|
|
33
|
+
@description("4K (2160p) video bitrate (35-45 Mbps upload recommendation)")
|
|
34
|
+
let size_video_4k = 40 Mbit/s
|
|
35
|
+
|
|
36
|
+
# --- Compression (Silesia corpus, single core) ---
|
|
37
|
+
# highlight: zstd ratio
|
|
38
|
+
@url("https://github.com/facebook/zstd")
|
|
39
|
+
@description("zstd -1 compression ratio (2.9x; 510 MB/s compress, 1,550 MB/s decompress)")
|
|
40
|
+
let size_ratio_zstd = 2.896
|
|
41
|
+
|
|
42
|
+
@url("https://github.com/facebook/zstd")
|
|
43
|
+
@description("LZ4 compression ratio (2.1x; 675 MB/s compress, 3,850 MB/s decompress)")
|
|
44
|
+
let size_ratio_lz4 = 2.101
|
|
45
|
+
|
|
46
|
+
@url("https://github.com/facebook/zstd")
|
|
47
|
+
@description("zlib -1 (gzip) compression ratio (2.7x; 105 MB/s compress)")
|
|
48
|
+
let size_ratio_zlib = 2.743
|
|
49
|
+
|
|
50
|
+
# --- Redundancy overhead (raw bytes stored per logical byte) ---
|
|
51
|
+
# highlight: replication
|
|
52
|
+
@url("https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSErasureCoding.html")
|
|
53
|
+
@description("3x replication: 3 bytes stored per byte (200% overhead)")
|
|
54
|
+
let size_replication_3x = 3
|
|
55
|
+
|
|
56
|
+
@url("https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSErasureCoding.html")
|
|
57
|
+
@description("Reed-Solomon RS(6,3) erasure coding: 1.5 bytes stored per byte (50% overhead), tolerates 3 losses")
|
|
58
|
+
let size_erasure_rs_6_3 = 1.5
|
|
59
|
+
|
|
60
|
+
# --- Platform size caps (max / min) ---
|
|
61
|
+
# highlight: S3 object max
|
|
62
|
+
@url("https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html")
|
|
63
|
+
@description("S3 maximum object size (48.8 TiB, via multipart upload)")
|
|
64
|
+
let size_s3_object_max = 48.8 TiB
|
|
65
|
+
|
|
66
|
+
@url("https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html")
|
|
67
|
+
@description("S3 multipart minimum part size (5 MiB; the last part can be smaller; parts max out at 5 GiB)")
|
|
68
|
+
let size_s3_part_min = 5 MiB
|
|
69
|
+
|
|
70
|
+
@url("https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Constraints.html")
|
|
71
|
+
@description("DynamoDB maximum item size (400 KiB, binary units, attribute names included)")
|
|
72
|
+
let size_dynamodb_item_max = 400 KiB
|
|
73
|
+
|
|
74
|
+
@url("https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Constraints.html")
|
|
75
|
+
@description("DynamoDB maximum partition size (10 GiB; also the item-collection cap when a table has an LSI)")
|
|
76
|
+
let size_dynamodb_partition_max = 10 GiB
|
|
77
|
+
|
|
78
|
+
@url("https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/quotas-messages.html")
|
|
79
|
+
@description("SQS maximum message size (1 MiB; larger payloads go to S3 via the extended client)")
|
|
80
|
+
let size_sqs_message_max = 1 MiB
|
|
81
|
+
|
|
82
|
+
@url("https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html")
|
|
83
|
+
@description("Lambda synchronous invocation payload, request or response (6 MB each)")
|
|
84
|
+
let size_lambda_payload_max = 6 MB
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# AWS managed-service rate quotas
|
|
2
|
+
# Per-second throughput ceilings, mostly adjustable. Byte caps live in `size`
|
|
3
|
+
# and dimensionless caps in `count`; this module is only rates.
|
|
4
|
+
# Import with: use throughput::aws then use the throughput_aws_* values
|
|
5
|
+
# title: Throughput (AWS)
|
|
6
|
+
# checked: unverified
|
|
7
|
+
# description: AWS rate quotas: EC2 network, VPC packet limits, EBS, Kinesis, SQS, Lambda and API Gateway
|
|
8
|
+
# vendor: aws
|
|
9
|
+
|
|
10
|
+
# --- EC2 network ---
|
|
11
|
+
# highlight: EC2 flow
|
|
12
|
+
@url("https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html")
|
|
13
|
+
@description("EC2 single TCP/UDP flow bandwidth outside a cluster placement group (5 Gbps; 10 Gbps inside one, 25 Gbps with ENA Express)")
|
|
14
|
+
let throughput_aws_ec2_single_flow = 5 Gbit/s
|
|
15
|
+
|
|
16
|
+
@url("https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html")
|
|
17
|
+
@description("EC2 bandwidth to the internet for instances under 32 vCPUs (5 Gbps; larger ones get 50% of instance bandwidth)")
|
|
18
|
+
let throughput_aws_ec2_internet_small_instance = 5 Gbit/s
|
|
19
|
+
|
|
20
|
+
# --- VPC packet limits ---
|
|
21
|
+
# highlight: link-local pps
|
|
22
|
+
@url("https://docs.aws.amazon.com/vpc/latest/userguide/AmazonDNS-concepts.html")
|
|
23
|
+
@description("Packets per second to link-local services per network interface: Route 53 Resolver DNS, IMDS and NTP together (1,024; cannot be increased)")
|
|
24
|
+
let throughput_aws_link_local_packets = 1_024 packet/s
|
|
25
|
+
|
|
26
|
+
@url("https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-basics.html")
|
|
27
|
+
@description("NAT gateway packet rate before it scales (1 million packets/s; 5 Gbps of bandwidth)")
|
|
28
|
+
let throughput_aws_nat_gateway_packets = 1_000_000 packet/s
|
|
29
|
+
|
|
30
|
+
@url("https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-basics.html")
|
|
31
|
+
@description("NAT gateway maximum packet rate after scaling (10 million packets/s; beyond it packets drop, so split across subnets)")
|
|
32
|
+
let throughput_aws_nat_gateway_packets_max = 10_000_000 packet/s
|
|
33
|
+
|
|
34
|
+
# --- EBS gp3 ---
|
|
35
|
+
# highlight: gp3 baseline
|
|
36
|
+
@url("https://docs.aws.amazon.com/ebs/latest/userguide/general-purpose.html")
|
|
37
|
+
@description("EBS gp3 baseline IOPS included in the price")
|
|
38
|
+
let throughput_aws_ebs_gp3_baseline_iops = 3_000 IOPS
|
|
39
|
+
|
|
40
|
+
@url("https://docs.aws.amazon.com/ebs/latest/userguide/general-purpose.html")
|
|
41
|
+
@description("EBS gp3 baseline throughput included in the price (125 MiB/s)")
|
|
42
|
+
let throughput_aws_ebs_gp3_baseline = 125 MiB/s
|
|
43
|
+
|
|
44
|
+
@url("https://docs.aws.amazon.com/ebs/latest/userguide/general-purpose.html")
|
|
45
|
+
@description("EBS gp3 maximum provisioned IOPS per volume (80,000; 500 IOPS per GiB)")
|
|
46
|
+
let throughput_aws_ebs_gp3_max_iops = 80_000 IOPS
|
|
47
|
+
|
|
48
|
+
@url("https://docs.aws.amazon.com/ebs/latest/userguide/general-purpose.html")
|
|
49
|
+
@description("EBS gp3 maximum provisioned throughput per volume (2,000 MiB/s)")
|
|
50
|
+
let throughput_aws_ebs_gp3_max = 2_000 MiB/s
|
|
51
|
+
|
|
52
|
+
# --- Kinesis Data Streams (provisioned, per shard) ---
|
|
53
|
+
# highlight: Kinesis shard
|
|
54
|
+
@url("https://docs.aws.amazon.com/streams/latest/dev/service-sizes-and-limits.html")
|
|
55
|
+
@description("Kinesis shard write limit (1 MB/s or 1,000 records/s, whichever hits first)")
|
|
56
|
+
let throughput_aws_kinesis_shard_write = 1 MB/s
|
|
57
|
+
|
|
58
|
+
@url("https://docs.aws.amazon.com/streams/latest/dev/service-sizes-and-limits.html")
|
|
59
|
+
@description("Kinesis shard write record limit")
|
|
60
|
+
let throughput_aws_kinesis_shard_records = 1_000 record/s
|
|
61
|
+
|
|
62
|
+
@url("https://docs.aws.amazon.com/streams/latest/dev/service-sizes-and-limits.html")
|
|
63
|
+
@description("Kinesis shard read limit, shared by consumers (2 MB/s; enhanced fan-out gives each consumer its own)")
|
|
64
|
+
let throughput_aws_kinesis_shard_read = 2 MB/s
|
|
65
|
+
|
|
66
|
+
# --- SQS ---
|
|
67
|
+
# highlight: SQS FIFO
|
|
68
|
+
@url("https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/quotas-messages.html")
|
|
69
|
+
@description("SQS FIFO API calls per second per action, without high-throughput mode (3,000 messages/s with batches of 10)")
|
|
70
|
+
let throughput_aws_sqs_fifo_requests = 300 request/s
|
|
71
|
+
|
|
72
|
+
@url("https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/quotas-messages.html")
|
|
73
|
+
@description("SQS FIFO high-throughput mode API calls per second (us-east-1; 700k messages/s batched; standard queues are nearly unlimited)")
|
|
74
|
+
let throughput_aws_sqs_fifo_high_requests = 70_000 request/s
|
|
75
|
+
|
|
76
|
+
# --- Lambda ---
|
|
77
|
+
# highlight: Lambda scale
|
|
78
|
+
@url("https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html")
|
|
79
|
+
@description("Lambda concurrency scaling rate per function (1,000 execution environments every 10 s, i.e. 100/s); in requests in flight, like count_lambda_concurrency")
|
|
80
|
+
let throughput_aws_lambda_scale_requests = 100 request/s
|
|
81
|
+
|
|
82
|
+
# --- API Gateway ---
|
|
83
|
+
# highlight: API GW
|
|
84
|
+
@url("https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html")
|
|
85
|
+
@description("API Gateway throttle per account per region (10,000 RPS, burst 5,000; adjustable)")
|
|
86
|
+
let throughput_aws_apigw_requests = 10_000 request/s
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Per-database throughput, order of magnitude
|
|
2
|
+
# Figures from each engine's own benchmark tooling. They swing by ~10x with
|
|
3
|
+
# hardware, payload, durability (fsync) and cache hit rate, so treat them as
|
|
4
|
+
# magnitudes, not specs. Some are in documents/rows per second (Elasticsearch,
|
|
5
|
+
# ClickHouse), not operations; DynamoDB values are per-partition/per-table caps.
|
|
6
|
+
# Byte caps and counts live in `size` and `count`.
|
|
7
|
+
# Import with: use throughput::db then use the throughput_db_* values
|
|
8
|
+
# title: Throughput (DB)
|
|
9
|
+
# checked: unverified
|
|
10
|
+
# description: Order-of-magnitude per-engine rates and DynamoDB caps: Redis, Cassandra, MongoDB, SQL, DynamoDB, Elasticsearch, ClickHouse
|
|
11
|
+
# vendor: aws, redis, cassandra, mongodb, mysql, postgresql, elasticsearch, clickhouse
|
|
12
|
+
|
|
13
|
+
# --- Redis (in-memory; command execution is single-threaded) ---
|
|
14
|
+
# highlight: Redis
|
|
15
|
+
@url("https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/benchmarks/")
|
|
16
|
+
@description("Redis GET/SET on one instance, no pipelining (~10^5 ops/s)")
|
|
17
|
+
let throughput_db_redis_ops = 150_000 operation/s
|
|
18
|
+
|
|
19
|
+
@url("https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/benchmarks/")
|
|
20
|
+
@description("Redis GET/SET with pipelining, network-bound (>10^6 ops/s)")
|
|
21
|
+
let throughput_db_redis_pipelined_ops = 1_000_000 operation/s
|
|
22
|
+
|
|
23
|
+
# --- Cassandra (wide-column, LSM) ---
|
|
24
|
+
# highlight: Cassandra write
|
|
25
|
+
@url("https://axonops.com/docs/data-platforms/cassandra/operations/performance/benchmarking")
|
|
26
|
+
@description("Cassandra replica writes per node (~20k-100k/s); client-visible writes per node are this / replication factor")
|
|
27
|
+
let throughput_db_cassandra_write_ops = 50_000 operation/s
|
|
28
|
+
|
|
29
|
+
@url("https://netflixtechblog.com/benchmarking-cassandra-scalability-on-aws-over-a-million-writes-per-second-39f45f066c9e")
|
|
30
|
+
@description("Cassandra client writes per node: throughput_db_cassandra_write_ops / replication factor (RF=3; Netflix 2011 on m1.xlarge: 1.1M client writes/s on 288 nodes, ~3.8k/node; modern nodes ~5k-20k)")
|
|
31
|
+
let throughput_db_cassandra_client_write_ops = throughput_db_cassandra_write_ops / 3
|
|
32
|
+
|
|
33
|
+
@url("https://axonops.com/docs/data-platforms/cassandra/operations/performance/benchmarking")
|
|
34
|
+
@description("Cassandra reads per node (~10k-50k ops/s)")
|
|
35
|
+
let throughput_db_cassandra_read_ops = 25_000 operation/s
|
|
36
|
+
|
|
37
|
+
# --- MongoDB (document) ---
|
|
38
|
+
# highlight: MongoDB
|
|
39
|
+
@url("https://www.mongodb.com/company/blog/through-the-looking-glass-analyzing-the-interplay-between-memory-disk-and-read-performance")
|
|
40
|
+
@description("MongoDB YCSB ops/s per node (~10^4-10^5; cache-resident)")
|
|
41
|
+
let throughput_db_mongodb_ops = 50_000 operation/s
|
|
42
|
+
|
|
43
|
+
# --- PostgreSQL / MySQL (relational OLTP) ---
|
|
44
|
+
# highlight: SQL write
|
|
45
|
+
@url("https://docs.aws.amazon.com/whitepapers/latest/optimizing-mysql-on-ec2-using-amazon-ebs/mysql-benchmark-observations-and-considerations.html")
|
|
46
|
+
@description("Relational OLTP write transactions per node, conservative (~10^3-10^4 txn/s; small instance, multi-statement txns, fsync per commit)")
|
|
47
|
+
let throughput_db_sql_write_ops = 5_000 operation/s
|
|
48
|
+
|
|
49
|
+
@url("https://docs.aws.amazon.com/whitepapers/latest/optimizing-mysql-on-ec2-using-amazon-ebs/mysql-benchmark-observations-and-considerations.html")
|
|
50
|
+
@description("Relational OLTP reads per node, conservative (~10^4-10^5 queries/s; see _high for a big tuned box)")
|
|
51
|
+
let throughput_db_sql_read_ops = 20_000 operation/s
|
|
52
|
+
|
|
53
|
+
@url("https://www.cybertec-postgresql.com/en/postgres-scaling-advice-for-2021/")
|
|
54
|
+
@description("PostgreSQL point reads on a large tuned server (~25k-32k TPS per core; ~1M on a high-end box, in-memory)")
|
|
55
|
+
let throughput_db_sql_read_ops_high = 500_000 operation/s
|
|
56
|
+
|
|
57
|
+
@url("https://www.cybertec-postgresql.com/en/postgres-scaling-advice-for-2021/")
|
|
58
|
+
@description("PostgreSQL write transactions on NVMe, tuned (pgbench TPC-B-like: ~45k TPS on a 6-core workstation)")
|
|
59
|
+
let throughput_db_sql_write_ops_high = 45_000 operation/s
|
|
60
|
+
|
|
61
|
+
@url("https://www.scylladb.com/2023/10/24/sql-vs-nosql-at-scale-lee-atchinson-dor-laors-take")
|
|
62
|
+
@description("Rule of thumb: mixed read/write load a relational primary handles before you reach for replicas or sharding (~10k-50k ops/s)")
|
|
63
|
+
let throughput_db_sql_node_ceiling_ops = 50_000 operation/s
|
|
64
|
+
|
|
65
|
+
# --- DynamoDB (managed; caps, per partition and per table) ---
|
|
66
|
+
# highlight: DynamoDB
|
|
67
|
+
@url("https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ServiceQuotas.html")
|
|
68
|
+
@description("DynamoDB writes per partition: 1,000 WCU/s (1 KB items)")
|
|
69
|
+
let throughput_db_dynamodb_wcu = 1_000 dynamodb_wru/s
|
|
70
|
+
|
|
71
|
+
@url("https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ServiceQuotas.html")
|
|
72
|
+
@description("DynamoDB strongly consistent reads per partition: 3,000 RCU/s (4 KB items; eventually consistent reads count half)")
|
|
73
|
+
let throughput_db_dynamodb_rcu = 3_000 dynamodb_rru/s
|
|
74
|
+
|
|
75
|
+
@url("https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ServiceQuotas.html")
|
|
76
|
+
@description("DynamoDB default per-table write throughput: 40,000 WCU/s (on-demand and provisioned; adjustable)")
|
|
77
|
+
let throughput_db_dynamodb_table_wcu = 40_000 dynamodb_wru/s
|
|
78
|
+
|
|
79
|
+
@url("https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ServiceQuotas.html")
|
|
80
|
+
@description("DynamoDB default per-table read throughput: 40,000 RCU/s (on-demand and provisioned; adjustable)")
|
|
81
|
+
let throughput_db_dynamodb_table_rcu = 40_000 dynamodb_rru/s
|
|
82
|
+
|
|
83
|
+
# --- Elasticsearch / OpenSearch (search index; values are documents/s) ---
|
|
84
|
+
# highlight: Elasticsearch
|
|
85
|
+
@url("https://www.elastic.co/blog/benchmarking-and-sizing-your-elasticsearch-cluster-for-logs-and-metrics")
|
|
86
|
+
@description("Elasticsearch indexing per shard/node (~20k docs/s, batched bulk)")
|
|
87
|
+
let throughput_db_elasticsearch_index_records = 20_000 record/s
|
|
88
|
+
|
|
89
|
+
# --- ClickHouse (columnar OLAP; values are rows/s) ---
|
|
90
|
+
# highlight: ClickHouse
|
|
91
|
+
@url("https://clickhouse.com/docs/concepts/features/operations/insert/inserting-data")
|
|
92
|
+
@description("ClickHouse batched inserts (~10^6 rows/s on one server, order of magnitude)")
|
|
93
|
+
let throughput_db_clickhouse_insert_rows = 1_000_000 row/s
|
|
94
|
+
|
|
95
|
+
@url("https://clickhouse.com/docs/best-practices/selecting-an-insert-strategy")
|
|
96
|
+
@description("ClickHouse recommended insert query rate (~1 insert/s, each 10k-100k rows; use async inserts for many small writers)")
|
|
97
|
+
let throughput_db_clickhouse_insert_requests = 1 request/s
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Amazon S3 request-rate and throughput numbers
|
|
2
|
+
# Sources: AWS S3 performance documentation. Object/multipart caps live in `size` and `count`.
|
|
3
|
+
# Import with: use throughput::s3 then use the throughput_s3_* values
|
|
4
|
+
# title: Throughput (S3)
|
|
5
|
+
# checked: unverified
|
|
6
|
+
# description: Amazon S3 request rates, connections and throughput
|
|
7
|
+
# vendor: aws
|
|
8
|
+
# source: https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html
|
|
9
|
+
|
|
10
|
+
# highlight: GET/s per prefix
|
|
11
|
+
@url("https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html")
|
|
12
|
+
@description("S3 Standard: GET/HEAD requests per second per prefix (at least)")
|
|
13
|
+
let throughput_s3_get_requests_per_prefix = 5_500 request/s
|
|
14
|
+
|
|
15
|
+
@url("https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html")
|
|
16
|
+
@description("S3 Standard: PUT/COPY/POST/DELETE per second per prefix (at least)")
|
|
17
|
+
let throughput_s3_put_requests_per_prefix = 3_500 request/s
|
|
18
|
+
|
|
19
|
+
# highlight: per connection
|
|
20
|
+
@url("https://d1.awsstatic.com/whitepapers/AmazonS3BestPractices.pdf")
|
|
21
|
+
@description("S3 Standard: one concurrent request per ~85-90 MB/s of desired throughput (legacy whitepaper; no longer in current docs)")
|
|
22
|
+
let throughput_s3_per_connection = 90 MB/s
|
|
23
|
+
|
|
24
|
+
@url("https://d1.awsstatic.com/whitepapers/AmazonS3BestPractices.pdf")
|
|
25
|
+
@description("S3 Standard: ~15 concurrent connections to saturate a 10 Gb/s NIC (legacy whitepaper)")
|
|
26
|
+
let throughput_s3_connections_10gbe = 15
|
|
27
|
+
|
|
28
|
+
# highlight: Express GET/s
|
|
29
|
+
@url("https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-performance.html")
|
|
30
|
+
@description("S3 Express One Zone: default GET TPS per directory bucket")
|
|
31
|
+
let throughput_s3_express_get_requests_default = 200_000 request/s
|
|
32
|
+
|
|
33
|
+
@url("https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-optimizing-performance-design-patterns.html")
|
|
34
|
+
@description("S3 Express One Zone: max GET TPS per directory bucket (up to)")
|
|
35
|
+
let throughput_s3_express_get_requests_max = 2_000_000 request/s
|
|
36
|
+
|
|
37
|
+
@url("https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-performance.html")
|
|
38
|
+
@description("S3 Express One Zone: default PUT TPS per directory bucket")
|
|
39
|
+
let throughput_s3_express_put_requests_default = 100_000 request/s
|
|
40
|
+
|
|
41
|
+
@url("https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-optimizing-performance-design-patterns.html")
|
|
42
|
+
@description("S3 Express One Zone: max PUT TPS per directory bucket (up to)")
|
|
43
|
+
let throughput_s3_express_put_requests_max = 200_000 request/s
|
|
44
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Per-node service throughput calibration
|
|
2
|
+
# Order-of-magnitude rates for one machine: service, cache, database, queue.
|
|
3
|
+
# The database figures mirror throughput::db (modules can't import each other).
|
|
4
|
+
# Import with: use throughput::service then use the throughput_service_* values
|
|
5
|
+
# title: Throughput (Service)
|
|
6
|
+
# checked: unverified
|
|
7
|
+
# description: Per-node request rates for services, caches, databases and queues
|
|
8
|
+
# vendor: aws, redis, kafka, mysql
|
|
9
|
+
|
|
10
|
+
# highlight: service
|
|
11
|
+
@url("https://www.techempower.com/benchmarks/")
|
|
12
|
+
@description("Rule-of-thumb capacity per service node for business logic plus one database round trip (~10^3-10^4 requests/s); workload and hardware vary. Framework-only benchmarks reach 10^5-10^6 requests/s")
|
|
13
|
+
let throughput_service_requests = 10_000 request/s
|
|
14
|
+
|
|
15
|
+
# highlight: cache
|
|
16
|
+
@url("https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/benchmarks/")
|
|
17
|
+
@description("Rule-of-thumb capacity per in-memory cache node (~10^5 operations/s); one Redis process without pipelining is ~150k, while multi-threaded memcached can go higher")
|
|
18
|
+
let throughput_service_cache_ops = 100_000 operation/s
|
|
19
|
+
|
|
20
|
+
@url("https://docs.aws.amazon.com/whitepapers/latest/optimizing-mysql-on-ec2-using-amazon-ebs/mysql-benchmark-observations-and-considerations.html")
|
|
21
|
+
@description("Relational node reads, well-indexed, conservative (~10^4-10^5 QPS; same as throughput_db_sql_read_ops)")
|
|
22
|
+
let throughput_service_db_read_ops = 20_000 operation/s
|
|
23
|
+
|
|
24
|
+
# highlight: DB writes
|
|
25
|
+
@url("https://docs.aws.amazon.com/whitepapers/latest/optimizing-mysql-on-ec2-using-amazon-ebs/mysql-benchmark-observations-and-considerations.html")
|
|
26
|
+
@description("Relational node writes, conservative (~10^3-10^4/s; same as throughput_db_sql_write_ops)")
|
|
27
|
+
let throughput_service_db_write_ops = 5_000 operation/s
|
|
28
|
+
|
|
29
|
+
# highlight: Kafka
|
|
30
|
+
@url("https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines")
|
|
31
|
+
@description("Kafka broker, small messages (~10^5-10^6/s; LinkedIn: 821k 100-byte records/s from one producer)")
|
|
32
|
+
let throughput_service_kafka_msgs = 500_000 message/s
|
|
33
|
+
|
|
34
|
+
@url("https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/")
|
|
35
|
+
@description("Kafka produce throughput per partition (Confluent: 10s of MB/s on one partition; plan ~10 MB/s)")
|
|
36
|
+
let throughput_service_kafka_partition = 10 MB/s
|
|
37
|
+
|
|
38
|
+
@url("https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/")
|
|
39
|
+
@description("Kafka partitions per broker before availability suffers (Confluent: 2,000-4,000; KRaft clusters raise this)")
|
|
40
|
+
let throughput_service_kafka_partitions_per_broker = 4_000
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Storage throughput and IOPS
|
|
2
|
+
# Per-device sequential and random (4 KB) performance, plus link rates.
|
|
3
|
+
# Import with: use throughput::storage then use the throughput_storage_* values
|
|
4
|
+
# title: Throughput (Storage)
|
|
5
|
+
# checked: unverified
|
|
6
|
+
# description: Sequential and random (4 KB) throughput and IOPS for HDD, SSD, NVMe and tape
|
|
7
|
+
# source: https://en.wikipedia.org/wiki/IOPS
|
|
8
|
+
|
|
9
|
+
# --- HDD (7,200 RPM) ---
|
|
10
|
+
# highlight: HDD seq
|
|
11
|
+
@url("https://en.wikipedia.org/wiki/Hard_disk_drive")
|
|
12
|
+
@description("HDD sequential read (~100-200 MB/s)")
|
|
13
|
+
let throughput_storage_hdd_seq_read = 200 MB/s
|
|
14
|
+
|
|
15
|
+
@url("https://en.wikipedia.org/wiki/Hard_disk_drive")
|
|
16
|
+
@description("HDD sequential write (~100-200 MB/s)")
|
|
17
|
+
let throughput_storage_hdd_seq_write = 200 MB/s
|
|
18
|
+
|
|
19
|
+
# highlight: HDD 4K read
|
|
20
|
+
@url("https://en.wikipedia.org/wiki/IOPS")
|
|
21
|
+
@description("HDD random 4 KB read IOPS (Wikipedia: 73-79 for 7,200 RPM SATA; 10k RPM is ~140-150)")
|
|
22
|
+
let throughput_storage_hdd_rand_read_iops = 80 IOPS
|
|
23
|
+
|
|
24
|
+
@url("https://en.wikipedia.org/wiki/IOPS")
|
|
25
|
+
@description("HDD random 4 KB write IOPS (7,200 RPM; same mechanics as reads)")
|
|
26
|
+
let throughput_storage_hdd_rand_write_iops = 80 IOPS
|
|
27
|
+
|
|
28
|
+
@url("https://en.wikipedia.org/wiki/IOPS")
|
|
29
|
+
@description("HDD random 4 KB read throughput (throughput_storage_hdd_rand_read_iops × 4 KB)")
|
|
30
|
+
let throughput_storage_hdd_rand_read = throughput_storage_hdd_rand_read_iops * 4 KiB/io -> MiB/s
|
|
31
|
+
|
|
32
|
+
@url("https://en.wikipedia.org/wiki/IOPS")
|
|
33
|
+
@description("HDD random 4 KB write throughput (throughput_storage_hdd_rand_write_iops × 4 KB)")
|
|
34
|
+
let throughput_storage_hdd_rand_write = throughput_storage_hdd_rand_write_iops * 4 KiB/io -> MiB/s
|
|
35
|
+
|
|
36
|
+
# --- SATA SSD ---
|
|
37
|
+
# highlight: SATA seq
|
|
38
|
+
@url("https://en.wikipedia.org/wiki/Solid-state_drive")
|
|
39
|
+
@description("SATA SSD sequential read (~550 MB/s)")
|
|
40
|
+
let throughput_storage_sata_ssd_seq_read = 550 MB/s
|
|
41
|
+
|
|
42
|
+
@url("https://en.wikipedia.org/wiki/Solid-state_drive")
|
|
43
|
+
@description("SATA SSD sequential write (~520 MB/s)")
|
|
44
|
+
let throughput_storage_sata_ssd_seq_write = 520 MB/s
|
|
45
|
+
|
|
46
|
+
# highlight: SATA 4K read
|
|
47
|
+
@url("https://en.wikipedia.org/wiki/IOPS")
|
|
48
|
+
@description("SATA SSD random 4 KB read IOPS (~100k)")
|
|
49
|
+
let throughput_storage_sata_ssd_rand_read_iops = 100_000 IOPS
|
|
50
|
+
|
|
51
|
+
@url("https://en.wikipedia.org/wiki/IOPS")
|
|
52
|
+
@description("SATA SSD random 4 KB write IOPS (~90k)")
|
|
53
|
+
let throughput_storage_sata_ssd_rand_write_iops = 90_000 IOPS
|
|
54
|
+
|
|
55
|
+
@url("https://en.wikipedia.org/wiki/IOPS")
|
|
56
|
+
@description("SATA SSD random 4 KB read throughput (throughput_storage_sata_ssd_rand_read_iops × 4 KB)")
|
|
57
|
+
let throughput_storage_sata_ssd_rand_read = throughput_storage_sata_ssd_rand_read_iops * 4 KiB/io -> MiB/s
|
|
58
|
+
|
|
59
|
+
@url("https://en.wikipedia.org/wiki/IOPS")
|
|
60
|
+
@description("SATA SSD random 4 KB write throughput (throughput_storage_sata_ssd_rand_write_iops × 4 KB)")
|
|
61
|
+
let throughput_storage_sata_ssd_rand_write = throughput_storage_sata_ssd_rand_write_iops * 4 KiB/io -> MiB/s
|
|
62
|
+
|
|
63
|
+
# --- NVMe SSD (PCIe 5.0 x4) ---
|
|
64
|
+
# highlight: NVMe seq
|
|
65
|
+
@url("https://semiconductor.samsung.com/ssd/enterprise-ssd/pm1743/")
|
|
66
|
+
@description("NVMe SSD sequential read (~14 GB/s, PCIe 5.0 x4; Samsung PM1743: up to 14,000 MB/s)")
|
|
67
|
+
let throughput_storage_nvme_seq_read = 14 GB/s
|
|
68
|
+
|
|
69
|
+
@url("https://en.wikipedia.org/wiki/Solid-state_drive")
|
|
70
|
+
@description("NVMe SSD sequential write (~12 GB/s on fast consumer Gen5; many enterprise Gen5 drives list ~6-10 GB/s)")
|
|
71
|
+
let throughput_storage_nvme_seq_write = 12 GB/s
|
|
72
|
+
|
|
73
|
+
# highlight: NVMe 4K read
|
|
74
|
+
@url("https://en.wikipedia.org/wiki/IOPS")
|
|
75
|
+
@description("NVMe SSD random 4 KB read IOPS at high queue depth (~1M Gen4, 2M+ Gen5 enterprise; see _qd1 for a single thread)")
|
|
76
|
+
let throughput_storage_nvme_rand_read_iops = 1_000_000 IOPS
|
|
77
|
+
|
|
78
|
+
@url("https://en.wikipedia.org/wiki/IOPS")
|
|
79
|
+
@description("NVMe SSD random 4 KB write IOPS, sustained (~200k-400k steady state; ~1M only in burst / fresh-out-of-box)")
|
|
80
|
+
let throughput_storage_nvme_rand_write_iops = 300_000 IOPS
|
|
81
|
+
|
|
82
|
+
# highlight: NVMe QD1
|
|
83
|
+
@url("https://simplyblock.io/glossary/nvme-latency/")
|
|
84
|
+
@description("NVMe random 4 KB read IOPS at queue depth 1 (~1 / 60 us latency, 10k-50k; what one synchronous thread sees)")
|
|
85
|
+
let throughput_storage_nvme_rand_read_qd1_iops = 16_000 IOPS
|
|
86
|
+
|
|
87
|
+
@url("https://en.wikipedia.org/wiki/IOPS")
|
|
88
|
+
@description("NVMe SSD random 4 KB read throughput (throughput_storage_nvme_rand_read_iops × 4 KB)")
|
|
89
|
+
let throughput_storage_nvme_rand_read = throughput_storage_nvme_rand_read_iops * 4 KiB/io -> MiB/s
|
|
90
|
+
|
|
91
|
+
@url("https://en.wikipedia.org/wiki/IOPS")
|
|
92
|
+
@description("NVMe SSD random 4 KB write throughput (throughput_storage_nvme_rand_write_iops × 4 KB)")
|
|
93
|
+
let throughput_storage_nvme_rand_write = throughput_storage_nvme_rand_write_iops * 4 KiB/io -> MiB/s
|
|
94
|
+
|
|
95
|
+
# --- Tape ---
|
|
96
|
+
# highlight: tape
|
|
97
|
+
@url("https://en.wikipedia.org/wiki/Linear_Tape-Open")
|
|
98
|
+
@description("LTO-9 tape sequential (~400 MB/s)")
|
|
99
|
+
let throughput_storage_tape_seq = 400 MB/s
|
|
100
|
+
|
|
101
|
+
# --- Link rates ---
|
|
102
|
+
# highlight: SATA III
|
|
103
|
+
@url("https://en.wikipedia.org/wiki/Serial_ATA")
|
|
104
|
+
@description("SATA III link rate (~600 MB/s, 6 Gbit/s)")
|
|
105
|
+
let throughput_storage_interface_sata3 = 600 MB/s
|
|
106
|
+
|
|
107
|
+
@url("https://en.wikipedia.org/wiki/Serial_Attached_SCSI")
|
|
108
|
+
@description("SAS-3 link rate (~1.2 GB/s, 12 Gbit/s)")
|
|
109
|
+
let throughput_storage_interface_sas3 = 1.2 GB/s
|
|
110
|
+
|
|
111
|
+
@url("https://en.wikipedia.org/wiki/PCI_Express")
|
|
112
|
+
@description("PCIe 4.0 x4 link (a Gen4 NVMe SSD, ~7.88 GB/s)")
|
|
113
|
+
let throughput_storage_interface_pcie4_x4 = 7.88 GB/s
|
|
114
|
+
|
|
115
|
+
@url("https://en.wikipedia.org/wiki/PCI_Express")
|
|
116
|
+
@description("PCIe 5.0 x4 link (a Gen5 NVMe SSD, ~15.75 GB/s)")
|
|
117
|
+
let throughput_storage_interface_pcie5_x4 = 15.75 GB/s
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Throughput numbers every programmer should know
|
|
2
|
+
# Memory, interconnect and network bandwidth.
|
|
3
|
+
# Import with: use throughput then use the throughput_* values
|
|
4
|
+
# title: Throughput
|
|
5
|
+
# checked: unverified
|
|
6
|
+
# description: Cache, DRAM, PCIe and network bandwidth
|
|
7
|
+
# source: https://en.wikipedia.org/wiki/List_of_interface_bit_rates
|
|
8
|
+
|
|
9
|
+
# --- CPU caches (per core, measured; varies ~2x by microarchitecture) ---
|
|
10
|
+
@url("https://en.wikipedia.org/wiki/CPU_cache")
|
|
11
|
+
@description("L1 cache bandwidth per core (~1 TB/s; estimate: 2 x 64 B loads/cycle at ~5 GHz is 640 GB/s, more with AVX-512)")
|
|
12
|
+
let throughput_l1 = 1 TB/s
|
|
13
|
+
|
|
14
|
+
@url("https://en.wikipedia.org/wiki/CPU_cache")
|
|
15
|
+
@description("L2 cache bandwidth per core (~200-500 GB/s; estimate: 64 B/cycle at ~5 GHz)")
|
|
16
|
+
let throughput_l2 = 300 GB/s
|
|
17
|
+
|
|
18
|
+
@url("https://en.wikipedia.org/wiki/CPU_cache")
|
|
19
|
+
@description("L3 cache bandwidth seen by one core (~100-200 GB/s; whole-chip aggregate is much higher)")
|
|
20
|
+
let throughput_l3 = 150 GB/s
|
|
21
|
+
|
|
22
|
+
# --- DRAM: per channel, per core, per socket differ by ~10x ---
|
|
23
|
+
# highlight: DRAM/socket
|
|
24
|
+
@url("https://www.amd.com/content/dam/amd/en/documents/epyc-business-docs/datasheets/amd-epyc-9005-series-processor-datasheet.pdf")
|
|
25
|
+
@description("DRAM bandwidth per server socket, peak (12 x DDR5-6000 channels = 576 GB/s on AMD EPYC 9005)")
|
|
26
|
+
let throughput_dram_socket = 576 GB/s
|
|
27
|
+
|
|
28
|
+
@url("https://en.wikipedia.org/wiki/DDR5_SDRAM")
|
|
29
|
+
@description("DRAM bandwidth per DDR5-4800 channel/DIMM (4.8 GT/s x 8 B = 38.4 GB/s; DDR5-6400 is 51.2 GB/s)")
|
|
30
|
+
let throughput_dram_channel = 38.4 GB/s
|
|
31
|
+
|
|
32
|
+
@url("https://www.cs.virginia.edu/stream/")
|
|
33
|
+
@description("DRAM bandwidth one core can pull (~10-30 GB/s; estimate, measure with STREAM)")
|
|
34
|
+
let throughput_dram_core = 20 GB/s
|
|
35
|
+
|
|
36
|
+
@url("https://en.wikipedia.org/wiki/DDR5_SDRAM")
|
|
37
|
+
@description("Alias of throughput_dram_channel; prefer the explicit _core / _channel / _socket values")
|
|
38
|
+
let throughput_dram = throughput_dram_channel
|
|
39
|
+
|
|
40
|
+
# --- PCIe (x16, per direction) ---
|
|
41
|
+
@url("https://en.wikipedia.org/wiki/PCI_Express")
|
|
42
|
+
@description("PCIe 3.0 x16 interconnect (15.75 GB/s per direction)")
|
|
43
|
+
let throughput_pcie3_x16 = 15.75 GB/s
|
|
44
|
+
|
|
45
|
+
@url("https://en.wikipedia.org/wiki/PCI_Express")
|
|
46
|
+
@description("PCIe 4.0 x16 interconnect (31.5 GB/s per direction)")
|
|
47
|
+
let throughput_pcie4_x16 = 31.5 GB/s
|
|
48
|
+
|
|
49
|
+
# highlight: PCIe 5
|
|
50
|
+
@url("https://en.wikipedia.org/wiki/PCI_Express")
|
|
51
|
+
@description("PCIe 5.0 x16 interconnect (63 GB/s per direction)")
|
|
52
|
+
let throughput_pcie5_x16 = 63 GB/s
|
|
53
|
+
|
|
54
|
+
# --- Ethernet line rates (TCP goodput is ~90-95% of these) ---
|
|
55
|
+
@url("https://en.wikipedia.org/wiki/List_of_interface_bit_rates")
|
|
56
|
+
@description("1 Gigabit Ethernet (125 MB/s)")
|
|
57
|
+
let throughput_lan_1gbe = 125 MB/s
|
|
58
|
+
|
|
59
|
+
@url("https://en.wikipedia.org/wiki/List_of_interface_bit_rates")
|
|
60
|
+
@description("10 Gigabit Ethernet")
|
|
61
|
+
let throughput_lan_10gbe = 1.25 GB/s
|
|
62
|
+
|
|
63
|
+
@url("https://en.wikipedia.org/wiki/List_of_interface_bit_rates")
|
|
64
|
+
@description("25 Gigabit Ethernet (a common cloud server NIC)")
|
|
65
|
+
let throughput_lan_25gbe = 3.125 GB/s
|
|
66
|
+
|
|
67
|
+
# highlight: 100 GbE
|
|
68
|
+
@url("https://en.wikipedia.org/wiki/List_of_interface_bit_rates")
|
|
69
|
+
@description("100 Gigabit Ethernet")
|
|
70
|
+
let throughput_lan_100gbe = 12.5 GB/s
|
|
71
|
+
|
|
72
|
+
@url("https://en.wikipedia.org/wiki/List_of_interface_bit_rates")
|
|
73
|
+
@description("400 Gigabit Ethernet (datacenter spine / AI cluster links)")
|
|
74
|
+
let throughput_lan_400gbe = 50 GB/s
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Shared units for AWS metering. In every session (via `units::systems`), not importable.
|
|
2
|
+
# title: Shared units (AWS)
|
|
3
|
+
# description: DynamoDB read and write request units
|
|
4
|
+
|
|
5
|
+
# DynamoDB read and write request units: what AWS meters, prices and caps, not raw
|
|
6
|
+
# API calls (item size and consistency can make one call consume several). Shared
|
|
7
|
+
# so `cost` prices and `throughput::db` caps multiply. A capacity unit (RCU/WCU)
|
|
8
|
+
# is one request unit per second.
|
|
9
|
+
dimension DynamodbReadRequestUnit
|
|
10
|
+
|
|
11
|
+
@name("DynamoDB read request unit")
|
|
12
|
+
@url("https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/read-write-operations.html")
|
|
13
|
+
@aliases(dynamodb_rru)
|
|
14
|
+
unit dynamodb_read_request_unit: DynamodbReadRequestUnit
|
|
15
|
+
|
|
16
|
+
dimension DynamodbWriteRequestUnit
|
|
17
|
+
|
|
18
|
+
@name("DynamoDB write request unit")
|
|
19
|
+
@url("https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/read-write-operations.html")
|
|
20
|
+
@aliases(dynamodb_wru)
|
|
21
|
+
unit dynamodb_write_request_unit: DynamodbWriteRequestUnit
|