Python
lambda

AWS LambdaのCPUを見てみる

昔は使えなかったんですが、いつの間にかmultiprocessingモジュールがサポートされていますね。

さて、とあるサービスの速度改善でシリアル処理をパラレルにしてみたのですが、殆ど改善が見られませんでした。
プロセス起動周りでオーバーヘッドが増えたりして、改善できたかと言えば微妙な結果、、

FAQには

AWS Lambda のリソースモデルでは、お客様が関数に必要なメモリ量を指定するとそれに比例した CPU パワーとその他のリソースが割り当てられます。たとえば、256 MB のメモリを指定すると約 2 倍の CPU パワーが Lambda 関数に割り当てられます。128 MB のメモリを指定した場合と比較すると CPU パワーは倍となり、512 MB のメモリを指定した場合と比較すると半分になります。メモリは 128 MB から 3 GB まで、64 MB ごとに増加できます。

とあるのですが、ある一定のところまではメモリ増やして改善したのですが、それ以降はどうも改善せず。。
ということで、メモリを128MB、3008MBにして、それぞれ以下のコードをPython3.6ランタイムで実行してみました。

import os
import multiprocessing

def lambda_handler(event, context):
    print(os.cpu_count())
    print(len(os.sched_getaffinity(0)))
    print(multiprocessing.cpu_count())
    return 

結果はこちら。

  • 128MB

Function Logs:
START RequestId: b65302db-e2b9-11e7-b501-371c5856c559 Version: $LATEST
2
2
2
END RequestId: b65302db-e2b9-11e7-b501-371c5856c559
REPORT RequestId: b65302db-e2b9-11e7-b501-371c5856c559 Duration: 0.27 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 23 MB

  • 3008MB

Function Logs:
START RequestId: a9ce5c14-e2b9-11e7-b543-f9c99b5b752f Version: $LATEST
2
2
2
END RequestId: a9ce5c14-e2b9-11e7-b543-f9c99b5b752f
REPORT RequestId: a9ce5c14-e2b9-11e7-b543-f9c99b5b752f Duration: 15.75 ms Billed Duration: 100 ms Memory Size: 3008 MB Max Memory Used: 26 MB

一緒すね(´・ω・`)

今度は以下のソースを実行

import subprocess

def lambda_handler(event, context):
    output = subprocess.run(['cat','/proc/cpuinfo'], check=True, stdout=subprocess.PIPE).stdout
    print(output.decode('utf8'))
    return
  • 128MB

Function Logs:
START RequestId: 844d00c4-e2bb-11e7-89f4-eb5f7d799335 Version: $LATEST
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 62
model name : Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz
stepping : 4
microcode : 0x42a
cpu MHz : 2793.168
cache size : 25600 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm fsgsbase smep erms xsaveopt
bugs :
bogomips : 5586.69
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:

processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 62
model name : Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz
stepping : 4
microcode : 0x42a
cpu MHz : 2793.168
cache size : 25600 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 1
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm fsgsbase smep erms xsaveopt
bugs :
bogomips : 5586.69
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:

END RequestId: 844d00c4-e2bb-11e7-89f4-eb5f7d799335
REPORT RequestId: 844d00c4-e2bb-11e7-89f4-eb5f7d799335 Duration: 10.90 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 23 MB

  • 3008MB

Function Logs:
START RequestId: af26164d-e2bb-11e7-8023-c7679992e57f Version: $LATEST
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 63
model name : Intel(R) Xeon(R) CPU E5-2666 v3 @ 2.90GHz
stepping : 2
microcode : 0x3b
cpu MHz : 2899.936
cache size : 25600 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bugs :
bogomips : 5800.06
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:

processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 63
model name : Intel(R) Xeon(R) CPU E5-2666 v3 @ 2.90GHz
stepping : 2
microcode : 0x3b
cpu MHz : 2899.936
cache size : 25600 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 1
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bugs :
bogomips : 5800.06
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:

END RequestId: af26164d-e2bb-11e7-8023-c7679992e57f
REPORT RequestId: af26164d-e2bb-11e7-8023-c7679992e57f Duration: 5.96 ms Billed Duration: 100 ms Memory Size: 3008 MB Max Memory Used: 25 MB

残念、、予想通りではありますが、どちらもcpu_coreは1ですね。並列処理にはそりゃ効かないか。
ただCPUパワーはどれほど上がるのか、、と期待しましたけども、model nameでは

Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz
Intel(R) Xeon(R) CPU E5-2666 v3 @ 2.90GHz

と、それほど差を感じない結果。

http://www.cpu-world.com/Compare/416/Intel_Xeon_E5-2666_v3_vs_Intel_Xeon_E5-2680_v2.html

ちなみに上記のCPUモデルが変わるのは1536MBと1600MBが境界みたいです。

多分vCPUは変わってるんでしょうが、コア数が変わらなければ並列処理に速度改善はそれほど望めない、という感じな結果でした。残念!