S3GW Performance Report

Warp(workload=delete, args=--concurrent=1,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000)

Throughput
2023-08-07T10:29:19.891979 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
Operations
2023-08-07T10:29:19.932624 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/

Warp(workload=delete, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)

At least one test suite failed this test :(

Warp(workload=delete, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000)

At least one test suite failed this test :(

Warp(workload=delete, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)

At least one test suite failed this test :(

Warp(workload=get, args=--concurrent=1,--duration=10m,--obj.size=256,128MiB,--obj.generator=random,--obj.randsize=true,--objects=2048)

Throughput
2023-08-07T10:29:19.969565 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
Operations
2023-08-07T10:29:20.010815 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/

Warp(workload=get, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)

At least one test suite failed this test :(

Warp(workload=get, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192,--range)

At least one test suite failed this test :(

Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=256,128MiB,--obj.generator=random,--obj.randsize=true,--objects=2048)

At least one test suite failed this test :(

Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)

At least one test suite failed this test :(

Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192,--range)

At least one test suite failed this test :(

Warp(workload=list, args=--concurrent=1,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=1000)

Throughput
2023-08-07T10:29:20.048316 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
Operations
2023-08-07T10:29:20.087775 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/

Warp(workload=list, args=--concurrent=1,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=10000)

Throughput
2023-08-07T10:29:20.126637 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
Operations
2023-08-07T10:29:20.164892 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/

Warp(workload=list, args=--concurrent=1,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000)

Throughput
2023-08-07T10:29:20.201752 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
Operations
2023-08-07T10:29:20.256938 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/

Warp(workload=list, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=1000)

Throughput
2023-08-07T10:29:20.295290 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
Operations
2023-08-07T10:29:20.335387 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/

Warp(workload=list, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=10000)

At least one test suite failed this test :(

Warp(workload=list, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000)

At least one test suite failed this test :(

Warp(workload=put, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--disable-multipart,--obj.randsize=false)

Throughput
2023-08-07T10:29:20.372700 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
Operations
2023-08-07T10:29:20.411847 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/

Warp(workload=put, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false)

Throughput
2023-08-07T10:29:20.448746 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
Operations
2023-08-07T10:29:20.488153 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/

Warp(workload=put, args=--concurrent=20,--duration=10m,--obj.size=256,128MiB,--obj.generator=random,--obj.randsize=true)

Throughput
2023-08-07T10:29:20.526262 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
Operations
2023-08-07T10:29:20.580075 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/

Warp(workload=put, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--disable-multipart,--obj.randsize=false)

Throughput
2023-08-07T10:29:20.617495 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
Operations
2023-08-07T10:29:20.657347 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/

Warp(workload=put, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false)

Throughput
2023-08-07T10:29:20.694264 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
Operations
2023-08-07T10:29:20.733921 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/

Test Failures

Warp(workload=delete, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000)
Warp(workload=delete, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)
Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=256,128MiB,--obj.generator=random,--obj.randsize=true,--objects=2048)
Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)
Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192,--range)
Warp(workload=list, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=10000)
Warp(workload=list, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000)
Warp(workload=delete, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)
Warp(workload=delete, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000)
Warp(workload=delete, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)
Warp(workload=get, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)
Warp(workload=get, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192,--range)
Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)
Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192,--range)
Warp(workload=list, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000)

Comparison Tables

> 1 faster, = 1 no change, < 1 slower, > 1.3x 😎

️0.18.0 ➙ ️0.19.0

Warp: Single Operation Benchmarks ➙ Warp: Single Operation Benchmarks

Test
delete-bw-mean
byte/s
delete-iops-mean
iops
list-bw-mean
byte/s
list-iops-mean
iops
read-bw-mean
byte/s
read-iops-mean
iops
write-bw-mean
byte/s
write-iops-mean
iops
Warp(workload=delete, args=--concurrent=1,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000) - 0.99x - - - - 0.98x 0.98x
Warp(workload=delete, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192) - - - - - - - -
Warp(workload=delete, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000) - - - - - - - -
Warp(workload=delete, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192) - - - - - - - -
Warp(workload=get, args=--concurrent=1,--duration=10m,--obj.size=256,128MiB,--obj.generator=random,--obj.randsize=true,--objects=2048) - - - - 0.98x 1.02x 0.66x 0.69x
Warp(workload=get, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192) - - - - - - - -
Warp(workload=get, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192,--range) - - - - - - - -
Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=256,128MiB,--obj.generator=random,--obj.randsize=true,--objects=2048) - - - - - - - -
Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192) - - - - - - - -
Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192,--range) - - - - - - - -
Warp(workload=list, args=--concurrent=1,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=1000) - - - 12.13x - - 0.93x 0.93x
Warp(workload=list, args=--concurrent=1,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=10000) - - - 10.89x - - 0.94x 0.94x
Warp(workload=list, args=--concurrent=1,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000) - - - 4.23x - - 0.99x 0.99x
Warp(workload=list, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=1000) - - - 15.77x - - - -
Warp(workload=list, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=10000) - - - - - - - -
Warp(workload=list, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000) - - - - - - - -
Warp(workload=put, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--disable-multipart,--obj.randsize=false) - - - - - - 1.00x 1.00x
Warp(workload=put, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false) - - - - - - 0.64x 0.64x
Warp(workload=put, args=--concurrent=20,--duration=10m,--obj.size=256,128MiB,--obj.generator=random,--obj.randsize=true) - - - - - - 0.95x 0.27x
Warp(workload=put, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--disable-multipart,--obj.randsize=false) - - - - - - 1.07x 1.07x
Warp(workload=put, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false) - - - - - - 0.57x 0.57x

Test Environment

human-id ️0.18.0 ️0.19.0
description Warp: Single Operation Benchmarks Warp: Single Operation Benchmarks
name warp-single-op warp-single-op
suite_id 9477fed2-c3f3-453f-b8b5-5f699e6f0ae5 99067bc1-8e83-4fd1-928b-07df39ee8ad6
under-test-image-tags quay.io/s3gw/s3gw:latest;quay.io/s3gw/s3gw:v0.18.0 quay.io/s3gw/s3gw:v0.19.0
under-test-image-id sha256:ae552220ad42b3b86cd6650f8654ff9088b93fe65d33afaa29443ec855091a10 sha256:cb2644fbe9e2756f5a5585ba63ffdcc6712b17c908467757555676c45ece8621
under-test-s3gw-version ceph version Development (no_version) reef (dev) ceph version Development (no_version) reef (dev)
avg_test_runtime 24.79899405368737 16.925951294027843
cpu-count 8 8
cpu-model Intel(R) Xeon(R) CPU E3-1260L v5 @ 2.90GHz Intel(R) Xeon(R) CPU E3-1260L v5 @ 2.90GHz
disk-model INTEL SSDPED1K375GA INTEL SSDPED1K375GA
finished 2023-07-13 22:41:22.785 2023-08-04 04:58:13.415
memtotalkb 65666824 65666824
n_tests 21 21
node-name ares ares
os-release 5.14.21-150400.24.41-default 5.14.21-150400.24.41-default
runtime_min 390.0 505.0
start 2023-07-13 16:11:04.193 2023-08-03 20:33:41.342
test-image-id sha256:bacd98d777965bcc8a2f1a53cbe6ab1116aa5a02ace8f13818f733489d66eaf7 sha256:3421d68ddd4f7086cc02680bb0211d69395d50ab993bb1d476e3930eb55a4192
test-image-tags minio/warp:latest minio/warp:latest
test-warp-version warp version 0.7.4 - 560cb38 warp version 0.7.5 - 77be8b7

Latency Graphs

Warp(workload=delete, args=--concurrent=1,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000)

Test
️0.18.0
2023-08-07T10:29:20.798181 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 3 65 23 23
2023-08-07T10:29:20.859811 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
DELETE 10115 10308 10228 10229
️0.19.0
2023-08-07T10:29:20.920879 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 3 62 23 23
2023-08-07T10:29:21.004495 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
DELETE 10195 10477 10320 10322

Warp(workload=delete, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)

Test
️0.18.0
2023-08-07T10:29:21.064092 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 288 380 321 316
2023-08-07T10:29:21.123307 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
DELETE 830 1029 876 880
️0.19.0 failed

Warp(workload=delete, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000)

Test
️0.18.0 failed
️0.19.0 failed

Warp(workload=delete, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)

Test
️0.18.0 failed
️0.19.0 failed

Warp(workload=get, args=--concurrent=1,--duration=10m,--obj.size=256,128MiB,--obj.generator=random,--obj.randsize=true,--objects=2048)

Test
️0.18.0
No data
No data
️0.19.0
No data
No data

Warp(workload=get, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)

Test
️0.18.0
2023-08-07T10:29:21.185465 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 288 392 321 316
2023-08-07T10:29:21.245653 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
GET 23 63 30 30
️0.19.0 failed

Warp(workload=get, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192,--range)

Test
️0.18.0
2023-08-07T10:29:21.306398 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 284 388 321 316
No data
️0.19.0 failed

Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=256,128MiB,--obj.generator=random,--obj.randsize=true,--objects=2048)

Test
️0.18.0 failed
️0.19.0
No data
No data

Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192)

Test
️0.18.0 failed
️0.19.0 failed

Warp(workload=get, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false,--objects=8192,--range)

Test
️0.18.0 failed
️0.19.0 failed

Warp(workload=list, args=--concurrent=1,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=1000)

Test
️0.18.0
2023-08-07T10:29:21.368566 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 3 11 4 4
2023-08-07T10:29:21.430816 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
LIST 453 763 475 463
️0.19.0
2023-08-07T10:29:21.535256 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 3 9 4 4
2023-08-07T10:29:21.597163 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
LIST 25 101 39 36

Warp(workload=list, args=--concurrent=1,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=10000)

Test
️0.18.0
2023-08-07T10:29:21.657937 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 3 25 6 5
2023-08-07T10:29:21.717181 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
LIST 4821 6074 4954 4856
️0.19.0
2023-08-07T10:29:21.786635 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 3 15 6 6
2023-08-07T10:29:21.849497 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
LIST 344 600 455 454

Warp(workload=list, args=--concurrent=1,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000)

Test
️0.18.0
2023-08-07T10:29:21.911814 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 3 64 23 23
2023-08-07T10:29:21.971478 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
LIST 49688 62943 51207 49913
️0.19.0
2023-08-07T10:29:22.032610 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 3 63 23 23
2023-08-07T10:29:22.154473 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
LIST 11860 12286 12106 12127

Warp(workload=list, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=1000)

Test
️0.18.0
2023-08-07T10:29:22.214499 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
LIST 399 715 542 539
️0.19.0
2023-08-07T10:29:22.285510 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 16 609 63 42
2023-08-07T10:29:22.347272 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
LIST 3 133 34 26

Warp(workload=list, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=10000)

Test
️0.18.0 failed
️0.19.0
2023-08-07T10:29:22.412620 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 4 3507 104 27
2023-08-07T10:29:22.471328 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
LIST 30 302 101 98

Warp(workload=list, args=--concurrent=20,--duration=10m,--obj.size=256,--obj.randsize=false,--objects=100000)

Test
️0.18.0 failed
️0.19.0 failed

Warp(workload=put, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--disable-multipart,--obj.randsize=false)

Test
️0.18.0
2023-08-07T10:29:22.532804 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 203 226 216 216
️0.19.0
2023-08-07T10:29:22.598643 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 203 229 215 216

Warp(workload=put, args=--concurrent=1,--duration=10m,--obj.size=32MiB,--obj.randsize=false)

Test
️0.18.0
2023-08-07T10:29:22.661948 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 288 368 314 308
️0.19.0
2023-08-07T10:29:22.723439 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 456 528 489 488

Warp(workload=put, args=--concurrent=20,--duration=10m,--obj.size=256,128MiB,--obj.generator=random,--obj.randsize=true)

Test
️0.18.0
No data
️0.19.0
No data

Warp(workload=put, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--disable-multipart,--obj.randsize=false)

Test
️0.18.0
2023-08-07T10:29:22.785645 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 963 3445 1465 1449
️0.19.0
2023-08-07T10:29:22.938203 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 989 1801 1370 1367

Warp(workload=put, args=--concurrent=20,--duration=10m,--obj.size=32MiB,--obj.randsize=false)

Test
️0.18.0
2023-08-07T10:29:23.001532 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 1140 1465 1369 1427
️0.19.0
2023-08-07T10:29:23.063573 image/svg+xml Matplotlib v3.7.2, https://matplotlib.org/
op fastest [ms] slowest [ms] avg [ms] median [ms]
PUT 3326 5346 4087 4072