ã¯ããã«
Cloud Platformé¨ã®pddgã§ãã2024å¹´ããµãã¼ã¤ã³ã¿ã¼ã³ã·ãããéå¬ãããã©ãããã©ã¼ã ï¼èªç¤¾åºç¤ï¼ã³ã¼ã¹ã¨ãã¦2åã®æ¹ãåãå ¥ãã¾ããã æ¨å¹´ã®æ§åã¯ä»¥ä¸ããã覧ããã ãã¾ããèå³ãããã°æ¯éã覧ä¸ããã
ä»åã¯åãå ¥ãããäºæ¹ã®ãã¡è¤æ¬é½äººããï¼static-fujiï¼ã«æ å½ãã¦ããã ããæ¤è¨¼ã®ä¸ã§çºè¦ããããç´æçã§ãªãæåã«ã¤ãã¦ãè¤æ¬ããã«ããæ¤è¨¼çµæã社å¡ãã¾ã¨ãããã®ã«ãªãã¾ãã ãã®è¨äºå ã§ã®æ¤è¨¼ã®ã»ã¨ãã©ã¯ã¤ã³ã¿ã¼ã³çã§ããè¤æ¬ããã«ãã£ã¦å®æ½ããããã®ã§ãããä¸é¨ç¤¾å¡ãã¤ã³ã¿ã¼ã³ã·ããå®äºå¾ã«ãã®è¨äºã®å·çã®ããã«çæããå³çãå«ã¾ãã¾ãã
ã¾ããããä¸äººã®ã¤ã³ã¿ã¼ã³çã®æ¹ã«ã¯Rustã§ãã¼ããã©ã³ãµãæ¸ãã¨ãã課é¡ã«ææ¦ãã¦ããã ãã¾ããããã¡ããã¤ã³ã¿ã¼ã³çã®æ¹ã«å¤§æ´»èºãã¦ããã ãã¦ãã¾ããæ¯éã覧ä¸ããã blog.cybozu.io
èæ¯
ãµã¤ãã¦ãºã§ã¯ãç¾è¡ã®ã¤ã³ãã©åºç¤ä¸ã§åä½ãã¦ããã¢ããªã±ã¼ã·ã§ã³ã»ããã«ã¦ã§ã¢ãKubernetesãã¼ã¹ã®æ°åºç¤ã«ç§»è¡ããããã¸ã§ã¯ããæ¨é²ä¸ã§ãã ãã®ä¸ã§ã課é¡ã®ä¸ã¤ã¨ãã¦ããããéçã³ã³ãã³ãï¼JavaScriptã»CSSãªã©ï¼ã®é ä¿¡ãµã¼ãã¹ãæãããã¦ãã¾ããç¾å¨ã¯nginxãå©ç¨ãã¦é ä¿¡ãã¦ããããã®ãã¹ãã®ãã¼ã«ã«ãã¡ã¤ã«ã·ã¹ãã ä¸ã«éçã³ã³ãã³ããã¢ãããã¼ããã¦ãã¾ãã ãã®æ¹å¼ã¯nginxã«ãã£ã¦å®å®ãã¦é«éã«ã¬ã¹ãã³ã¹ãè¿ããã®ã§ãããã³ã³ãã³ãé ä¿¡ãµã¼ããã¹ãã¼ããã«ã«ãªã£ã¦ãã¾ããKubernetesã¨ã®ç¸æ§ãè¯ããªãã¨ããåé¡ãããã¾ãã
ããã§ãæ°åºç¤ã§ã¯Cephã®Object Storageãæ´»ç¨ããã¢ããªã±ã¼ã·ã§ã³ãã¼ã ãæã¤S3äºæã®ãªãã¸ã§ã¯ããã±ããã«éçã³ã³ãã³ããã¢ãããã¼ãããããããnginxãåå¾ã»ãã£ãã·ã¥ãã¦é ä¿¡ãããµã¼ãã¹ãæ¤è¨ãã¦ãã¾ãããããã«ããnginxèªä½ã¯ã©ã®ãã±ãããè¦ã«è¡ããã®ã¿ç¥ã£ã¦ããã°ãããnginxã³ã³ããèªä½ã¯ã¹ãã¼ãã¬ã¹ã«ã§ãã¾ãã
PoCã使ãå®éã«åä½ãããã¨ã¯ããã£ããã®ã®ããã®æ§è½ï¼ã¬ã¤ãã³ã·ã»ã¹ã«ã¼ãããããã¼ãªã³ã°ã¢ãããã¼ãä¸ã®ããã©ã¼ãã³ã¹ããããã¯ã¨ã³ãã®ãã±ããã¸ã©ããããã®ã¢ã¯ã»ã¹ãçºçãããçï¼ãæ¤è¨¼ããããã«ãã¤ã³ã¿ã¼ã³çã¨ãã¦ã¸ã§ã¤ã³ããè¤æ¬ããã¸æ¤è¨¼ãä¾é ¼ãã¾ããã
nginxã®è¨å®
ãã®PoCã«ããã¦nginxã«ã¯ä»¥ä¸ã®æ§ãªè¨å®ãæ½ãã¦ãã¾ãããã ããç´æ¥çã«é¢ä¿ããããããªã¨ããã ãæç²ãã¦ãããä»ã®è¨å®ã¯çç¥ãã¦ãã¾ãã
load_module /usr/lib/nginx/modules/ndk_http_module.so; http { # proxy cacheã®è¨å® proxy_cache_path /cache/contents levels=2 # å®éã«ä½¿ããã¦ããéçã³ã³ãã³ãã®ãµã¤ãºãè¦ã¦æ±ºããå¤ keys_zone=cache:32M max_size=8G inactive=24h ; # proxy_cache_path ã¨åãããã¤ã¹ä¸ã®ãã£ã¬ã¯ããªãæå®ãã proxy_temp_path /cache/temp; # éçã³ã³ãã³ããé ä¿¡ããupstream upstream origin { # ããã«ã¯å®éã®å¤ãå ¥ã server {{ORIGIN_HOST}}:{{ORIGIN_PORT}} max_fails=0; keepalive 16; } server { listen 8080; proxy_cache cache; # ãã£ãã·ã¥ã®ãã¼ã¯URLã¨ããã # GET 㨠HEAD ãåä¸è¦ãããã®ã§ $request_method ã¯ä½¿ããªãã # ã¾ããã¯ã¨ãªå¼æ°ã¯ç¡è¦ããã proxy_cache_key "$scheme://$host$uri"; # 200 OK, 301 Moved Permanently, 302 Found, 303 See Other ã¯1ã¶æãã£ãã·ã¥ãã proxy_cache_valid 200 301 302 303 2592000s; # ãã以å¤ã®ãã¿ã¼ã³ (400, 429, 500 ãªã©) # ãªãªã¸ã³ãµã¼ãã¼ãå®ãããä¸ç¬ã ããã£ãã·ã¥ããã proxy_cache_valid any 1s; # ãã£ãã·ã¥ã®æ´æ°ä¸ã«åã URL ã«å¯¾ããåãåããããããã¯ãããã¨ã§ã # ãªãªã¸ã³ãµã¼ãã¼ã¸ã®åãåãããæ¸ããã proxy_cache_lock on; # proxy_pass ã«ã¯ã¨ã¹ã±ã¼ãæ¸ã¿ã®ãã¹ã渡ãå¿ è¦ãããã # ãããã$uri 㯠unescape ããã¦ãããããLua ã使ã£ã¦ã¨ã¹ã±ã¼ãããªããã°ãªããªãã # # Q. ãªã $request_uri ã使ããªãã®ãï¼ # $request_uri ã¯å ¥åããããã¹ããã®ã¾ã¾å ¥ã£ã¦ãããããã¨ã¹ã±ã¼ãæ¸ã¿ã®ã¯ãã§ããã # A. ä¾ãã°ã$request_uri ã "/../secretbucket/foobar" ã ã£ãå ´åã䏿£ã«ä»ã®ãã±ããã«ã¢ã¯ã»ã¹ããã¦ãã¾ãã # 䏿¹ $uri ã¯æ£è¦åæ¸ã¿ã§ãããã /../ ã®ãããªéªæªãªæååãå«ã¾ãªãã set_by_lua_block $escaped_path { -- ngx.escape_uri 㯠JavaScript ã® encodeURIComponent ã¨ç価ãªé¢æ°ã§ããã -- ããããããã§ã¯ JavaScript ã® encodeURI ç¸å½ã®é¢æ°ãå¿ è¦ãªã®ã§èªä½ããå¿ è¦ãããã -- (ææ°ã® lua-nginx-module ã«ã¯ãã®ãããªé¢æ°ãåå¨ããããapt ã§å ¥ã lua-nginx-module ã¯æ®å¿µãªããå¤ã) -- https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/encodeURI local function encode_uri(uri) return uri:gsub("[^A-Za-z0-9;,/?:@&=+$_.!~*'()#-]", function(c) return string.format("%%%02X", string.byte(c)) end) end return encode_uri(ngx.var.uri) } location / { # ããã«ã¯å®éã®å¤ãå ¥ã proxy_pass http://origin/{{BUCKET}}$escaped_path; } }
è² è·è©¦é¨ã®å®æ½
Grafana k6ãå©ç¨ãã¦è² è·è©¦é¨ã宿½ãã¦ããã ãã¾ãããè² è·è©¦é¨ã®æ§æã¯ä»¥ä¸ã®éãã§ãã
- ãã¹ãæé: 60s
- 1ç§ãããã®ãªã¯ã¨ã¹ãæ°ï¼rateï¼: 100~10000åï¼å¾è¿°ã®è¡¨ã®éãï¼
- ãã¹ãåæ°: ãªã¯ã¨ã¹ãæ°ãã¨ã«1å
- 確èªãããã¼ã¿: ã¬ã¤ãã³ã·ã®å¹³åï¼avgï¼ãæå°å¤ï¼minï¼ãä¸å¤®å¤ï¼medï¼ãæå¤§å¤ï¼maxï¼ããã¼ã»ã³ã¿ã¤ã«ï¼p(90)ãp(95)ï¼
- ãªã¯ã¨ã¹ãã®éä¿¡ãè¡ãPodã®ãªã½ã¼ã¹
- CPU: 18 core
- ã¡ã¢ãª: 24GiB
- Nginx Podã®ãªã½ã¼ã¹
- 3ã¬ããªã«
- CPU: 4 core
- ã¡ã¢ãª: 18GiB
ãã¹ãå®è¡ãã¨ã«Nginxã®Podã¯å使ãããã£ãã·ã¥ã¯æ®çºããã¦è©¦é¨ãã¦ãã¾ããã¾ããCephã®æ§æãã¹ããã¯ãªã©ã¯è¤éã§ãããã¨ãæ¬è¨äºã®ç¾è±¡ã¨ç´æ¥é¢ä¿ããªããã¨ããçç¥ããã¦ãã ããã
ã¢ã¯ã»ã¹ãã対象ã®ãã¡ã¤ã«ã¯ä»¥ä¸ã®ã¹ã¯ãªããã§ä½æããã10000åã®ããã¹ããã¡ã¤ã«ã§ãäºã対象ã®ãã±ããã«ã¢ãããã¼ããã¦ããã¾ãã
output_dir="./static-contents" num_files=10000 num_chars=10000 mkdir -p "$output_dir" for i in $(seq -f "%05g" 1 $num_files) do filename="file_$i.txt" base64 /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c $num_chars > "$output_dir/$filename" done
ã¾ããk6ã®ã¹ã¯ãªããã¯ä»¥ä¸ã®éãã§ãã
import http from 'k6/http'; import { check } from 'k6'; // ã©ã³ãã ã«ã¢ã¯ã»ã¹ããããæ¢åã®ã¢ã¸ã¥ã¼ã«ãå©ç¨ // Ref: https://grafana.com/docs/k6/latest/javascript-api/jslib/utils/randomitem/ import { randomItem } from '/tmp/index.js' // 対象ã®Sericeã®ã¢ãã¬ã¹ const baseUrl = 'http://nginx.dev-static-poc.svc.cluster.local/'; const fileNames = Array.from({ length: 10000}, (_, i)=>`file_${String(i).padStart(5, '0')}.txt`); // fileåã¯"file_0XXXX.txt" ã¨ãªã£ã¦ããï¼Xã«ã¯0~9ã®æ´æ°ãå ¥ãï¼ export const options = { scenarios: { contacts: { executor: 'constant-arrival-rate', duration: '60s', timeUnit: '1s', preAllocatedVUs: 200, // å®é¨ã®æ¡ä»¶ãã¨ã«å¤å rate: 10000, }, }, }; export default function (){ const params = { timeout: '10s', }; const fileName = randomItem(fileNames); const url = `${baseUrl}/${fileName}`; const res = http.get(url, params); // ã¬ã¹ãã³ã¹ãè¿ã£ã¦ãã¦200ã§ãããã¨ãç¢ºèª check (res, {'status = 200': (r) => r.status === 200}); }
測å®çµæ
ä»åè¨å®ããç¯å²ã®ç§éãªã¯ã¨ã¹ãæ°ã§ã¯ã»ã¨ãã©ã®ã±ã¼ã¹ã§ååé«éã«å¿çã§ãã¦ãã¾ããããã©ã®ãªã¯ã¨ã¹ãæ°ã®å ´åã§ãæãé ãã±ã¼ã¹ã§ã¯500msãããã§ã¬ã¤ãã³ã·ãé æã¡ããå¾åããããã¨ããããã¾ãããã¿ã¤ã ã¢ã¦ããªã©ã®è¨å®ãçãã¾ããããæ£ããStatus Code 200ãè¿ã£ã¦ãã¦ãã¾ããã
| rate | avg (μs) | min (μs) | med (μs) | max (ms) | p(90) (ms) | p(95) (ms) |
|---|---|---|---|---|---|---|
| 100 | 14,040 | 285.41 | 7,300 | 500.45 | 29.17 | 43.77 |
| 500 | 3,450 | 230.08 | 1,570 | 499.71 | 2.54 | 14.41 |
| 1,000 | 2,220 | 212.39 | 394.25 | 500.64 | 1.95 | 3.87 |
| 10,000 | 950.15 | 173.91 | 269.17 | 507.99 | 0.42 | 1.43 |
以ä¸ã¯åºåãããnginxã®ãã°ä¸ã®ã¬ã¹ãã³ã¹ã¿ã¤ã ãããã¹ãã¼ã¿ã¹ã³ã¼ãå¥ã«æå¤§å¤ãæç³»åã§ãããããããã®ã§ãã縦軸ãç§ã横軸ã¯çµéæéã表ãã¾ããå ¨ã¦200ãè¿ã£ã¦ãããæåã®æ°ç§ã¯500msç¨åº¦ã®ã¬ã¤ãã³ã·ã観測ããããã®å¾ã¯ã»ã¼0ã«è¿ã¥ãã¦ãã¾ãã*1ã

ãã®çµæãããupstreamã§ãããªãã¸ã§ã¯ãã¹ãã¬ã¼ã¸ãããã¼ã¿ãåå¾ãã¦ããéã«ã ã500msç¨åº¦ã®å¾ ã¡æéãçºçããå ´åãããã¨æ¨æ¸¬ãã¾ããããã®å¾ä»åã®è©¦é¨ã«å«ã¾ããããã¼ã¿å ¨ã¦ã®ãã£ãã·ã¥ãå®äºããã¨ãnginxã¯é常ã«é«éã«ã¬ã¹ãã³ã¹ãè¿ãããã«ãªããã®ãããªçµæã«ãªã£ãã®ã§ã¯ãªããã¨èãã¾ããã
å½åããã¯upstreamã§ããCephã®ãªãã¸ã§ã¯ãã¹ãã¬ã¼ã¸ã®æ§è½ã«ãªãããã®ç¹æ§ãããããã®ãããªã¬ã¤ãã³ã·ãçºçããã±ã¼ã¹ãå¤ãã®ãã¨èããCephã®ãªãã¸ã§ã¯ãã¹ãã¬ã¼ã¸ãå ¬éããã¨ã³ããã¤ã³ãã«ç´æ¥ãªã¯ã¨ã¹ãããè² è·è©¦é¨ãè¡ã£ã¦ã¿ã¾ããã
| rate | avg (μs) | min (μs) | med (μs) | max (ms) | p(90) (ms) | p(95) (ms) |
|---|---|---|---|---|---|---|
| 100 | 4,230 | 1,010 | 1,640 | 245.91 | 2.94 | 16.07 |
| 500 | 3,870 | 848.89 | 1,390 | 217.74 | 2.54 | 14.41 |
| 1,000 | 4450 | 826.12 | 1,350 | 279.08 | 7.17 | 20.03 |
| 10,000 | 19,960 | 813.8 | 17,830 | 342.66 | 32.53 | 40.17 |
ããããçµæã¨ãã¦å®æ¸¬ããã¬ã¤ãã³ã·ã¯æå¤§ã§ã500msã¾ã§éãããã¨ã¯ããã¾ããã§ãããnginxããã¯proxy_cache_lockã«ãã£ã¦Cephã¸ã®ãªã¯ã¨ã¹ãæ°ã¯ãã®è² è·æ¤è¨¼ãããå°ãªããã¨ãèããã¨ãCephããªã¯ã¨ã¹ããæããããªããªã£ã¦ããã¨ãã£ãåé¡ãèãã«ããã¨å¤æãã¾ããã
ããã¾ã§ã§ããããnginxã«åé¡ãããã§ããããã¨ãåãã£ãããããªã½ã¼ã¹éãªã©ã®èª¿æ´ãããããã¾ããããåé¡ã¯è§£æ¶ãã¾ããã§ãããã½ã¼ã¹ã³ã¼ãã«ç®ãéããã¨ãproxy_cache_lockã®å®è£ ã«åé¡ãããããã«æããã®ã§ãã®è¨å®ãå¤ãã¦ã¿ãã¨ãããåé¡ãè§£æ¶ããæ§åã観測ãããæå¤§ã§ãcephã®ãªãã¸ã§ã¯ãã¹ãã¬ã¼ã¸ããã®ã¬ã¹ãã³ã¹ã¿ã¤ã ã«è¿ãã¬ã¤ãã³ã·ã§åã¾ãããã«ãªãã¾ããã
| rate | avg (μs) | min (μs) | med (μs) | max (ms) | p(90) (ms) | p(95) (ms) |
|---|---|---|---|---|---|---|
| 100 | 6,970 | 225.36 | 1,690 | 254.06 | 19.43 | 30.85 |
| 500 | 5,970 | 216.04 | 1,640 | 293.99 | 17.88 | 27.02 |
| 1,000 | 2,870 | 193.73 | 395.05 | 246.27 | 2.35 | 10.4 |
| 10,000 | 656.6 | 169.22 | 265.43 | 224.46 | 0.42 | 1.4 |
æã ã®æ³å®ãã¦ããæå
測å®ãããçµæã¯æã ã®æ³å®ã¨ã¯ç°ãªããã®ã§ãå®è£ æã«ã¯nginxã®proxy_cache_lockã¯Goã«ãããsingleflightã®ãããªæåãããã¨æ³å®ãã¦ãã¾ããã
ã¤ã¾ããåããã¼ã«å¯¾ãã¦è¤æ°ã®ãªã¯ã¨ã¹ããæ¥ãå ´åãæåã®ãªã¯ã¨ã¹ããupstreamã«åãåãããè¡ãããã®çµæããã£ãã·ã¥ã«ä¿åããä»ã®ãªã¯ã¨ã¹ãã¯ãã®çµæãå¾ ã£ã¦ãã£ãã·ã¥ããåå¾ããã¨ãããã®ã§ããããã«ãã並åãªã¯ã¨ã¹ããæ¥ãå ´åã«upstreamã¸ã®åãåããã1åã«ãªããããupstreamã¸ã®è² è·ãæããããã¬ã¹ãã³ã¹ã®é å»¶ãæå¤§ã§upstreamã¸ã®æåã®åãåããã®ã¬ã¤ãã³ã·ã¶ãã«ãªãã¨èãã¦ãã¾ããã

ããããæ¸¬å®çµæããproxy_cache_lockã®æåã¯æã ã®æ³å®ãã¦ãããã®ã¨ã¯ç°ãªãå¯è½æ§ãé«ããã¨ããããã¾ããã
ãªã500msã§é æã¡ããã®ã
æªããã¨ç¨ãã proxy_cache_lockã®å®è£ ã«ã¯ã以ä¸ã®ãããªã³ã¼ããããã¾ããã https://github.com/nginx/nginx/blob/fb89d50eeb19d42d83144ff76c80d20e80c41aca/src/http/ngx_http_file_cache.c#L404-L460
ä¸é¨ãæç²ãã¾ãã
timer = c->wait_time - now;
ngx_add_timer(&c->wait_event, (timer > 500) ? 500 : timer);
ãªããããã«500msãããã§çºç«ããããªã¿ã¤ãã¼ã®å®è£ ãå ¥ã£ã¦ããããã«è¦ãã¾ããâ¦â¦
https://nginx.org/en/docs/dev/development_guide.html#timer_events
The function ngx_add_timer(ev, timer) sets a timeout for an event, ngx_del_timer(ev) deletes a previously set timeout. The global timeout red-black tree ngx_event_timer_rbtree stores all timeouts currently set. The key in the tree is of type ngx_msec_t and is the time when the event occurs. The tree structure enables fast insertion and deletion operations, as well as access to the nearest timeouts, which nginx uses to find out how long to wait for I/O events and for expiring timeout events.
nginxã®éçºããã¥ã¡ã³ãã«ããã® ngx_add_timer ã¯æå®ãããæéã§ã¿ã¤ã ã¢ã¦ããä½ããã®å¦çãè¡ã颿°ã§ããã¨æ¸ããã¦ãã¾ããproxy_cache_lockã®å®è£
ã§ã¯ wait_time - now 㨠500 ã®ãã¡å°ããæ¹ãã¿ã¤ãã¼ã«ã»ãããã¦ããããã500msã§ã¿ã¤ã ã¢ã¦ããã¦å¦çãçºç«ããããã§ãã
wait_timeãè¨å®ãã¦ããã®ã¯å®ã¯0ã§åæåãããã¨ããé¤ãã¦ä»¥ä¸ã®ç®æã ãã§ãããå®éã®ã¨ããlock_timeoutã®ç§æ°ã§timerã®è¨å®å¤ãå¤ãããæå¤§500msã®ã¿ã¤ãã¼ã«ãªã£ã¦ãããã¨ããããã¾ãã
if (c->wait_time == 0) { c->wait_time = now + c->lock_timeout; c->wait_event.handler = ngx_http_file_cache_lock_wait_handler; c->wait_event.data = r; c->wait_event.log = r->connection->log; } timer = c->wait_time - now;
ãã®lock_timeoutã¯proxy_cache_lock_timeoutã®å¤ãåç
§ãã¦ããããã©ã«ãã§ã¯5ç§ã«ãªã£ã¦ãã¾ãã
https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_lock_timeout
ãã£ã¦ãproxy_cache_lock_timeoutãããã©ã«ãã®ã¾ã¾proxy_cache_lockãæå¹ã«ããã¨ããªã¯ã¨ã¹ãã¯500msãã¨ã«ããã¯ã®ç¶æ
ã確èªãã¦ã¬ã¹ãã³ã¹ãè¿ãããã«ãªã£ã¦ãããã¨ããããã¾ãããupstreamããããããçãæéã§å¿çãè¿ããã¨ãã¦ããã®æéã§å¾éããã¦ãã¾ããããæå¤§ã§500msã®ã¬ã¤ãã³ã·ãçºçãããã¨ããããã¾ããã

対ç
対çã¨è¨ããã»ã©ã®ãã®ã§ã¯ããã¾ããããupstreamã®ã¬ã¤ãã³ã·ã500msãããå°ãããã¨ãåãã£ã¦ããã¨ã proxy_cache_lock_timeout ã500msãããå°ããå¤ã«ãããã¨ã§ãæå¤§ã®ã¬ã¤ãã³ã·ãä¸ãããã¨ãã§ãã¾ããã
ä¾ãã°400msã«ãã¦ã¿ãçµæã以ä¸ã®éãã§ãã
| rate | avg (μs) | min (μs) | med (μs) | max (ms) | p(90) (ms) | p(95) (ms) |
|---|---|---|---|---|---|---|
| 100 | 8,490 | 279.88 | 2,200 | 230.38 | 22.63 | 28.75 |
| 500 | 3,430 | 221.32 | 1,600 | 585.7 | 4.19 | 16.96 |
| 1,000 | 1,720 | 192.38 | 390.72 | 400.16 | 1.9 | 2.65 |
| 10,000 | 635.45 | 163.52 | 262.52 | 401.94 | 0.42 | 1.4 |
lock_timeoutã400msã«è¨å®ããã¨ã500msã§ã¯ãªã400msã®ã¨ããã«ã¬ã¤ãã³ã·ã®å£ãçã¾ããããã«ãªãã¾ããã

ãã ãããã¯upstreamã¸éããããªã¯ã¨ã¹ãæ°ã¨ã®ãã¬ã¼ããªãã®é¢ä¿ã«ãããããç¡å¶éã«çããããã¨ã¯ã§ãã¾ããããã®ã¿ã¤ã ã¢ã¦ãæéãè¶ ããã¨ãããã®ãªã¯ã¨ã¹ãã¯ãã®ã¾ã¾upstreamã«éããçµæã¯ãã£ãã·ã¥ãããªãã¨proxy_cache_lock_timeoutã®ããã¥ã¡ã³ãã«ã¯è¨è¼ããã¦ãã¾ãããã®ããupstreamã«æå¾ ãããé度ãããçãã¿ã¤ã ã¢ã¦ããè¨å®ãã¦ãã¾ãã¨ããã®æéå ã«å¿çãè¿ããªãããupstreamã¸ã®ãªã¯ã¨ã¹ãæ°ãå¢ããçµæã¨ãã¦upstreamã¸ã®è² è·ãå¢ãããã¨ã«ãªãã¾ãã
ã¾ã¨ã
ã¤ã³ã¿ã¼ã³ã·ãããéå¬ãå¦çã§ããè¤æ¬ããã«æã ãæ¤è¨ããéçã³ã³ãã³ãé ä¿¡ã·ã¹ãã ã®PoCã®è² è·æ¤è¨¼ãè¡ã£ã¦ããã ãã¾ãããã¡ã³ã¿ã¼ãæ³å®ãã¦ããªãã£ãã¨ããã«ããã©ã¼ãã³ã¹ä¸ã®åé¡ãåå¨ããããã«ãããnginxã®ä»æ§ã§ãããã¨ãæããã«ãã¦ããã ãã¾ããã大å¤å©ããã¾ããããããã¨ããããã¾ããã
ä»å¾ã¯ãã®ãããªåé¡ãçºçãããã¨ã念é ã«ãã©ã®ããã«éçã³ã³ãã³ãé ä¿¡ã·ã¹ãã ãæ§ç¯ãããã¡ã³ã¿ã¼ã¯é ãæ±ãã¦ãã¾ãããã®ãããªåé¡ã®è§£æ±ºã«ä¸ç·ã«åãçµãã§ããã ãã仲éãåéãã¦ãã¾ãããèå³ãããã°æ¯éãµã¤ãã¦ãºã®æ¡ç¨æ å ±ãã覧ãã ããã
ãæ´æ°å±¥æ´ã2024/10/01 ãã1人ã®ã¤ã³ã¿ã¼ã³çã®æ´»èºãç´¹ä»ããè¨äºã®ãªã³ã¯ãã追å ãã¾ããã
*1:ããã¯nginxã®ãã°ã®ç²¾åº¦ãããªç§ã¾ã§ã§ããããã¤ã¯ãç§ã§è¿ã£ã¦ããå¿çã¯ãã°ä¸ã§ã¯0ã«ãªã£ã¦ãã¾ãããã§ãã表ã®ãã¼ã¿ã¯ã¯ã©ã¤ã¢ã³ãï¼ã¤ã¾ãk6ï¼ã®åºåãããã¼ã¿ãå ã«ããå¤ã®ãããã¤ã¯ãç§ã¾ã§åºåããã¦ãã¾ãã