서론
개발자들은 제품을 개발하고 나서 가용성 증진과 쿼리 최적화 등의 다양한 방법으로 사용자 경험을 증진시키고자 노력한다.
사용자 경험을 증진시키기 위해서는 어떠한 점이 사용자 경험을 저해시키는 요소이며, 어떻게 개선시켜야 하는지 정확한 분석이 필요하다.
이번 글에서는 지연과 관련하여 개발자들이 참고하기에 좋은 컴퓨터 연산의 통상적인 지연 값에 대하여 알아볼 것이다.
차트
| Operation | Latency | Throughput | 1 MiB | 1 GiB |
| ----------------------------------- | ------- | ---------- | ------ | ------ |
| Sequential Memory R/W (64 bytes) | 0.5 ns | | | |
| ├ Single Thread, No SIMD | | 10 GiB/s | 100 μs | 100 ms |
| ├ Single Thread, SIMD | | 20 GiB/s | 50 μs | 50 ms |
| ├ Threaded, No SIMD | | 30 GiB/s | 35 μs | 35 ms |
| ├ Threaded, SIMD | | 35 GiB/s | 30 μs | 30 ms |
| Network Same-Zone | | 10 GiB/s | 100 μs | 100 ms |
| ├ Inside VPC | | 10 GiB/s | 100 μs | 100 ms |
| ├ Outside VPC | | 3 GiB/s | 300 μs | 300 ms |
| Hashing, not crypto-safe (64 bytes) | 25 ns | 2 GiB/s | 500 μs | 500 ms |
| Random Memory R/W (64 bytes) | 50 ns | 1 GiB/s | 1 ms | 1s |
| Fast Serialization `[8]` `[9]` † | N/A | 1 GiB/s | 1 ms | 1s |
| Fast Deserialization `[8]` `[9]` † | N/A | 1 GiB/s | 1 ms | 1s |
| System Call | 500 ns | N/A | N/A | N/A |
| Hashing, crypto-safe (64 bytes) | 100 ns | 1 GiB/s | 1 ms | 1s |
| Sequential SSD read (8 KiB) | 1 μs | 4 GiB/s | 200 μs | 200 ms |
| Context Switch `[1] [2]` | 10 μs | N/A | N/A | N/A |
| Sequential SSD write, -fsync (8KiB) | 10 μs | 1 GiB/s | 1 ms | 1s |
| TCP Echo Server (32 KiB) | 10 μs | 4 GiB/s | 200 μs | 200 ms |
| Decompression `[11]` | N/A | 1 GiB/s | 1 ms | 1s |
| Compression `[11]` | N/A | 500 MiB/s | 2 ms | 2s |
| Sequential SSD write, +fsync (8KiB) | 1 ms | 10 MiB/s | 100 ms | 2 min |
| Sorting (64-bit integers) | N/A | 200 MiB/s | 5 ms | 5s |
| Sequential HDD Read (8 KiB) | 10 ms | 250 MiB/s | 2 ms | 2s |
| Blob Storage GET, 1 conn | 50 ms | 500 MiB/s | 2 ms | 2s |
| Blob Storage GET, n conn (offsets) | 50 ms | NW limit | | |
| Blob Storage PUT, 1 conn | 50 ms | 100 MiB/s | 10 ms | 10s |
| Blob Storage PUT, n conn (multipart)| 150 ms | NW limit | | |
| Random SSD Read (8 KiB) | 100 μs | 70 MiB/s | 15 ms | 15s |
| Serialization `[8]` `[9]` † | N/A | 100 MiB/s | 10 ms | 10s |
| Deserialization `[8]` `[9]` † | N/A | 100 MiB/s | 10 ms | 10s |
| Proxy: Envoy/ProxySQL/Nginx/HAProxy | 50 μs | ? | ? | ? |
| Network within same region | 250 μs | 2 GiB/s | 500 μs | 500 ms |
| Premium network within zone/VPC | 250 μs | 25 GiB/s | 50 μs | 40 ms |
| {MySQL, Memcached, Redis, ..} Query | 500 μs | ? | ? | ? |
| Random HDD Read (8 KiB) | 10 ms | 0.7 MiB/s | 2 s | 30m |
| Network between regions `[6]` | [Varies][i] | 25 MiB/s | 40 ms | 40s |
| Network NA Central <-> East | 25 ms | 25 MiB/s | 40 ms | 40s |
| Network NA Central <-> West | 40 ms | 25 MiB/s | 40 ms | 40s |
| Network NA East <-> West | 60 ms | 25 MiB/s | 40 ms | 40s |
| Network EU West <-> NA East | 80 ms | 25 MiB/s | 40 ms | 40s |
| Network EU West <-> NA Central | 100 ms | 25 MiB/s | 40 ms | 40s |
| Network NA West <-> Singapore | 180 ms | 25 MiB/s | 40 ms | 40s |
| Network EU West <-> Singapore | 160 ms | 25 MiB/s | 40 ms | 40s |
위 Github의 자료는 기본적으로 많이 알려져 있는 구글의 자료에 추가하고 덧대어 만든 자료라고 볼 수 있다.
비슷한 자료들이 사진으로도 많이 돌아다니는 것을 볼 수 있다.
이러한 지표들을 활용하여 본인의 서비스의 속도가 어떻게 나타나는지 예측하거나 개선하는 부분에 참고할 수 있을 것 같다.
반응형