LoginSignup
8
1

More than 3 years have passed since last update.

AWS Lambdaのメモリを増やすと処理が遅くなる事がある

Posted at

背景

Lambdaで作成した関数のメモリー割当量を検証をしていた際にメモリー割当量を増やしたのにも関わらずレスポンスが遅くなることがありました。
そこで実際にCPU性能を調べてメモリ割り当て量によるレスポンスタイムの違いを調べてみたいと思います。

検証

検証方法

極力ネットワークの影響やファイルIOなど外部の影響を受けないようにするために今回は console.log を大量に行いCPUに負荷をかける。
Lambdaの画面よりテストボタンで下記のスクリプトを6回実行を行い、選択できる全メモリ量を記録して所要時間の中央値を比較するものとする。
ランタイムは Nodejs 12.x を使用する。

exports.handler = async (event) => {
    for (var i=0; i<100000; i++) {
        console.log(i);
    }
};

検証結果

各実行時間の中央値をグラフにしました。
グラフから分かる通り、特定容量の割当ての際にレスポンスが遅くなっていることがわかります。
特に320MB, 832MB, 1152MB, 1280MB, 1408MB, 1600MB, 1856MB, 2176MBを割当てている時は1つ前のメモリ割り当ての時より遅くなっているように見えます。
image.png

実際のデータ

(単位: ms)

メモリ割当て(MB) 128 192 256 320 384 448 512 576 670 704 768 832 896 960 1024 1088 1152 1216 1280 1344 1408 1472 1536 1600 1664 1728 1792 1856 1920 1984 2048 2112 2176 2240 2304 2368 2432 2496 2560 2624 2688 2752 2816 2880 2944 3008
1回目 10950.77 8201.07 5814.18 5966.13 5729.55 5723.14 4724.33 4153.5 3733.73 3565.68 2583.53 3190.4 2822.37 2569.92 2347.22 1981.93 2235.81 1848.89 2022.47 1534.96 1817.82 1597.62 1481.3 1747.87 1569.18 1654.93 1363.18 1544.76 1613.92 1181.73 1277.58 1006.02 1621.35 1117.45 1257.15 1292.14 1294.42 1233.39 1158.03 880.66 1077.74 1088.06 1212.63 952.35 1179.11 1153.72
2回目 10421.18 8521.08 5960.6 6250.09 5863.6 5415.62 4764.37 4473.18 3949.5 3520.41 2808.26 3442.74 2814.43 2728.59 2164.69 1795.63 2206.28 1680.51 2041.39 1702.64 2074.71 1446.24 1650.04 2024.75 1711.7 1669.22 1265.03 1524.88 1406.46 1092.27 1084.7 1049.3 1319.94 1069.22 1060 1269.98 1217.49 1166.16 1381.25 896.94 992.21 1265.96 1044.54 825.49 1267.98 1037.94
3回目 10222.12 9153.84 6069.04 6509.95 6414.02 4989.2 4679.15 4266.25 3895.65 3869.3 2510.32 3308.68 2813.33 2579.92 2121.47 2105.04 2385.77 2109.45 2421.56 1715.3 1765.66 1559.31 1397.52 1907.31 1605.9 1597.45 1274.13 1649.59 1306.1 1217.74 1136.2 1010.03 1284.73 1018.11 1200.73 1306.11 1116.84 1156.36 1197.12 930.91 1213.99 1079.63 1080.86 781.97 1022.66 1032.73
4回目 10305.98 8634.28 6110.45 6400.91 5479.86 5494.1 4631.91 4103.38 3661.71 3578.87 2898.53 3243.6 2844.66 2661.85 2100.88 1917.27 2227.38 1947.68 2079.02 1613.63 1972.19 1490.14 1406.78 1707.22 1734.4 1578.88 1119.14 1487.58 1674.75 1177.71 1081.94 1044.2 1383.72 1067.65 1224.56 1243.74 1391.61 1124.04 1225.27 910.26 1160.93 1282.11 1187.44 802.63 1058.49 1010.34
5回目 10291.44 8293.22 6082.04 6535.7 5839.27 5205.23 4623.24 4434.94 3778.08 3582.37 2895.32 3159.63 2976.67 2744.6 2020.52 2027.23 2364.78 1821.04 2276.9 1567.66 1900.94 1670.09 1494.78 1786.65 1615.66 1531.31 1226.62 1449.67 1338.4 1143.24 1179.26 1000.78 1274.51 892.29 1266.7 1312.06 1134.45 1191.96 1127.47 1035.05 1044.9 1342.09 1146.99 718.33 1172.24 1183.76
6回目 10492.8 9342.19 5719.58 6014.46 5840.15 5467.47 4487.31 4379.59 3912.33 3577.32 2815.24 3021.11 2965.64 3046.21 2127.71 2167.85 2538.71 1910.17 2060.21 1563.57 1830.7 1574.72 1368.29 1663.16 1705.49 1523.42 1425.23 1511.25 1536.57 1186.13 1315.22 1041.18 1476.96 991.06 1189.82 1150.31 1422.57 1264.08 1160.41 808.41 1098.36 1128.82 1038.49 852.77 1014.5 1053.97

(単位: ms)

メモリ割当て(MB) 128 192 256 320 384 448 512 576 670 704 768 832 896 960 1024 1088 1152 1216 1280 1344 1408 1472 1536 1600 1664 1728 1792 1856 1920 1984 2048 2112 2176 2240 2304 2368 2432 2496 2560 2624 2688 2752 2816 2880 2944 3008
中央値 10363.58 8577.68 6014.82 6325.5 5839.71 5441.545 4655.53 4322.92 3836.865 3578.095 2811.75 3217 2833.515 2695.22 2124.59 2004.58 2300.295 1879.53 2069.615 1590.645 1865.82 1567.015 1444.04 1767.26 1660.575 1588.165 1269.58 1518.065 1471.515 1179.72 1157.73 1025.605 1351.83 1042.88 1212.645 1281.06 1255.955 1179.06 1178.765 903.6 1088.05 1197.39 1113.925 814.06 1115.365 1045.955
平均 10447.38167 8690.946667 5959.315 6279.54 5861.075 5382.46 4651.718333 4301.806667 3821.833333 3615.658333 2751.866667 3227.693333 2872.85 2721.848333 2147.081667 1999.158333 2326.455 1886.29 2150.258333 1616.293333 1893.67 1556.353333 1466.451667 1806.16 1657.055 1592.535 1278.888333 1527.955 1479.366667 1166.47 1179.15 1025.251667 1393.535 1025.963333 1199.826667 1262.39 1262.896667 1189.331667 1208.258333 910.3716667 1098.021667 1197.778333 1118.491667 822.2566667 1119.163333 1078.743333
最大 10950.77 9342.19 6110.45 6535.7 6414.02 5723.14 4764.37 4473.18 3949.5 3869.3 2898.53 3442.74 2976.67 3046.21 2347.22 2167.85 2538.71 2109.45 2421.56 1715.3 2074.71 1670.09 1650.04 2024.75 1734.4 1669.22 1425.23 1649.59 1674.75 1217.74 1315.22 1049.3 1621.35 1117.45 1266.7 1312.06 1422.57 1264.08 1381.25 1035.05 1213.99 1342.09 1212.63 952.35 1267.98 1183.76
最小 10222.12 8201.07 5719.58 5966.13 5479.86 4989.2 4487.31 4103.38 3661.71 3520.41 2510.32 3021.11 2813.33 2569.92 2020.52 1795.63 2206.28 1680.51 2022.47 1534.96 1765.66 1446.24 1368.29 1663.16 1569.18 1523.42 1119.14 1449.67 1306.1 1092.27 1081.94 1000.78 1274.51 892.29 1060 1150.31 1116.84 1124.04 1127.47 808.41 992.21 1079.63 1038.49 718.33 1014.5 1010.34

まとめ

関数に必要なメモリ量を指定すると、それに比例した CPU パワーとその他のリソースが割り当てられます。

Lambdaはメモリ割当て量を増やせば増やすほどパフォーマンスが良くなると言われていますが、1個下のメモリ量を指定したほうが若干パフォーマンスが良くなることがあるようです。
メモリ量を検証する際は選択できるメモリ量の2個前後も検討してみると良いかもしれません。

実務での検証時にGolangで見つけましたが、Python, Node.jsでも再現しているようなのでLambdaの特性のようです。

8
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1