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

# 背景

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


# 検証

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


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

## 検証結果

各実行時間の中央値をグラフにしました。
グラフから分かる通り、特定容量の割当ての際にレスポンスが遅くなっていることがわかります。
特に320MB, 832MB, 1152MB, 1280MB, 1408MB, 1600MB, 1856MB, 2176MBを割当てている時は１つ前のメモリ割り当ての時より遅くなっているように見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142518/b74bc44f-cc1b-d9ac-c8d4-baf1ab60052f.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 |



# まとめ


https://aws.amazon.com/jp/lambda/pricing/
> 関数に必要なメモリ量を指定すると、それに比例した CPU パワーとその他のリソースが割り当てられます。

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

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