ã¿ãªããããã«ã¡ã¯ïŒãéèãœãªã¥ãŒã·ã§ã³äºæ¥éšã®åžå Žç³»ãœãªã¥ãŒã·ã§ã³1éšã®å¯ºå±±ã§ãã12 æã«å
¥ã£ãŠããäžæ°ã«å¯ããªã£ãããã«æããŸãã æ¬èšäºã¯ é»éåœéæ
å ±ãµãŒãã¹ Advent Calendar 2022 ã® 12 æ 22 æ¥ã®èšäºã§ãã æšå¹Žã® ã¢ããã³ãã«ã¬ã³ã㌠ã§ããã¯ããã°ã«åå ããŠä»¥æ¥ãæ®æ®µã®æ¥åã«ãããŠããäœãèšäºã«ã§ããããšã¯ãªãããªïŒããšèããããã«ãªããäžåšãå
å®ãã1幎ã§ããïŒ ä»åã¯ã AWS Fargate ã§å®è¡ãã Web ã¢ããªã±ãŒã·ã§ã³ïŒããã¯ãšã³ã API ïŒã®ãã«ãã¹ã¬ãããæ³å®å€ã®æåãšãªã£ãç¹ãã€ã³ãã©èŠç¹ã§èª¿æ»ããã®ã§ãçºçããäºè±¡ãšãã®å¯Ÿå¿æ¹æ³ã«ã€ããŠç޹ä»ããããŸãïŒ çºçããäºè±¡ æŠèŠ èª¿æ»éå§æã®äºæ³ åå Javaã®availableProcessors cgroupã®cpu.sharesãã©ã¡ãŒã¿ å¯Ÿå¿ ã³ã³ããå®çŸ©ã®cpuãã©ã¡ãŒã¿ã®æå® XX:ActiveProcessorCountãªãã·ã§ã³ã®å©çš éåæåŠçãæ€èšãã ãããã« çºçããäºè±¡ æŠèŠ ããã¯ãšã³ã API ããã¹ããã ã¯ã©ãŠã æ§æã¯äžå³ã®ãšããã§ããæ¬ä»¶ã§è§ŠããªããµãŒãã¹ã¯å²æããŠããŸãã ããã¯ãšã³ã API ã¯ã³ã³ããåãã AWS Fargate ã§ ECS ã¿ã¹ã¯ãšããŠèµ·åããŸãã API ãªã¯ ãšã¹ ã㯠Application Load Balancer ãåãä»ããã¿ãŒã²ããã°ã«ãŒãã«ç»é²ãã ECS ãµãŒãã¹ãžã«ãŒãã£ã³ã°ããå
žåç㪠ã¯ã©ãŠã ã¢ãŒããã¯ã㣠ã§ãã ããã¯ãšã³ã API 㯠Java (11)ã§å®è£
ãããŠããŸãã äºè±¡ã¯ãã¬ã¹ãã³ã¹ã®è¿åŽã«æéãèŠãããªã¯ ãšã¹ ãã®åŠçäžã«çºçããŸããã ALB ã®ã¿ãŒã²ããã°ã«ãŒãã®ãã«ã¹ãã§ãã¯ã¯ãããã¯ãšã³ã API ã®ãã«ã¹ãã§ãã¯çšãšã³ããã€ã³ããæå®ããŠããŸããããã®ãšã³ããã€ã³ãããã«ã¹ãã§ãã¯ã® ã¿ã€ã ã¢ãŠã æéå
ã«æ£åžžã¬ã¹ãã³ã¹ãè¿åŽããªãããšã éŸå€ ã®åæ°ä»¥äžã«ç¹°ãè¿ãããããã¯ã©ã€ã¢ã³ãã®ãªã¯ ãšã¹ ãåŠçäžã® Fargate ã¿ã¹ã¯ã Unhealthy ãšå€å®ããã忢ãããŠããŸããŸããã ã¿ã¹ã¯ã®åæ¢çç±ã«ã Task failed ELB health checks in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:XXXXXXXXXXXX:targetgroup/m5infr-sandb-D87C6CX3M8FL/a5285befd3edc05d) ãšåºåãããŠããŸãã 調æ»éå§æã®äºæ³ ç§ã¯äºè±¡ã®ååçºçæãåœè©²ã·ã¹ãã ïŒãããžã§ã¯ãã«ã¯é¢äžããŠããããåŸã«èª¿æ»ãåŒãåã£ã圢ã«ãªããŸãã ãã®äºè±¡ã®è©±ãèããåœå㯠CPU ãªãœãŒã¹ã®äžè¶³ãçç±ã ããããã¿ã¹ã¯ãµã€ãºããã¥ãŒãã³ã°ããã°ããïŒããã¯ãšã³ã API ã®ã¿ã¹ã¯ãµã€ãºã¯ vCPUïŒ1 ã§ããïŒãã®ã ãšèããŠããŸããã å®éã«æ€èšŒãããšãããç§ã®äºæ³ãšã¯ç°ãªãçµæãšãªããŸããããŸãã¯ãã®èª¿æ»çµæã玹ä»ããŸãã äºè±¡ãçºçããã¢ããªã±ãŒã·ã§ã³ãšã¯å¥ã«ã¢ããªããŒã ã調æ»çšã®ã¢ããªã±ãŒã·ã§ã³ãçšæããŠãããã®ã§ããããåãæ§æã§ AWS ã«ãããã€ãæ€èšŒããŸããã 4vCPU ãå²ãåœãŠã Fargate ã¿ã¹ã¯ã§åçŸãããæ€èšŒããŸãã API ãªã¯ ãšã¹ ãã¯ãã³ã³ããã€ã¡ãŒãžã®æåãã«ãçšéãšããŠäœæãã EC2 ã€ã³ã¹ã¿ã³ã¹ ã§è¡ããŸããã $ curl http://<ALBã®DNSå>:8080/sandbox/greet ; echo everyone! hello!everyone! /sandbox/greet ã¯ãªã¯ ãšã¹ ãã«å¯Ÿããå³åº§ã« hello! ãšè¿åŽãã API ã§ããäžèšã®ããã«æ£åžžæã¯ curl ã³ãã³ãã§ã¬ã¹ãã³ã¹ãååŸã§ããŸãã $ (curl http://<ALBã®DNSå>:8080/sandbox/sleep ; echo done at `date`) & [1] 3087 $ curl http://<ALBã®DNSå>:8080/sandbox/greet ; echo everyone! <html> <head><title>502 Bad Gateway</title></head> <body> <center><h1>502 Bad Gateway</h1></center> </body> </html> <html> <head><title>502 Bad Gateway</title></head> <body> <center><h1>502 Bad Gateway</h1></center> </body> </html> everyone! 次ã¯ã /sandbox/sleep ãšã³ããã€ã³ããããã¯ã°ã©ãŠã³ããžã§ããšããŠå®è¡ãããžã§ããçµäºããæ¥ä»ã衚瀺ããããã«ããŠããŸãã /sandbox/sleep 㯠TimeUnit.sleep ãç¡æéã«å®è¡ãã API ã§ããå¿çã«æéãèŠãã API ãšããã®ãç°¡æçã«è¡šçŸããŠããŸãã ããã¯ã°ã©ãŠã³ããžã§ãã®åŸã« /sandbox/greet ã curl ããŠããŸãããä»åºŠã¯ã¬ã¹ãã³ã¹ãååŸã§ããã« API ã³ã³ãããçµäºãããã 502 ãšã©ãŒãšãªã£ãŠããŸãã å®éã«ã¿ã¹ã¯ã忢ãããŠãããäºè±¡ãåçŸããŠããŸãã sleep ã§ã¢ã€ãã«ç¶æ
ã«ãªã£ãŠããã®ã§èªæã§ã¯ããã®ã§ããããªãœãŒã¹äœ¿çšçãäœãããšãã¡ããªã¯ã¹ãã確èªã§ããŸãã ã€ãŸããã¿ã¹ã¯ãµã€ãºã®ãã¥ãŒãã³ã°ã«ããè§£æ¶ãããšããç§ã®äºæ³ã«ã¯åããŠãæ¬ä»¶ã¯ã¿ã¹ã¯ãµã€ãºã«äŸããçºçããäºè±¡ã§ããããšãããããŸããã åå Java ã®availableProcessors ããã¯ãšã³ã API 㯠Java ã®ãã€ã¯ããµãŒãã¹è»œé ãã¬ãŒã ã¯ãŒã¯ ã§ãã Helidon ã䜿çšããŠããŸãã ãã® ãã¬ãŒã ã¯ãŒã¯ ã§ã¯ããã©ã«ãã®åäœãšããŠãã¹ã¬ããããŒã«æ°ã Runtime.getRuntime().availableProcessors() ã®æ»ãå€ã«èšå®ããŸãã 1 ECS/Fargate ã§ã¯ availableProcessors ã vCPU ã®ãµã€ãºã«äŸãã 1 ãšãªãããããã§ã«ã¹ã¬ããã䜿çšäžã®å Žåã«ããªã¯ ãšã¹ ããåŠçããããã®ã¹ã¬ãããæ°ãã«ååŸã§ããªãããšãåå ã§ãã å®éã«ç¢ºèªããŠã¿ãŸãã 確èªã¯ã ECS Exec ãå©çšã㊠Fargate å
ã§ CLI æäœãããããšã«ããè¡ããŸããã 察象ã®ã¿ã¹ã¯ã¯å
ã»ã©ãšåã 4vCPU ãå²ãåœãŠãŠããŸãã $ aws ecs describe-tasks --cluster m5infrasurvey-poc-ecs-cluster --tasks 6218b4dd29c146a6ac120c5395a6e462 { "tasks": [ { # çç¥ "cpu": "4096", # çç¥ "memory": "8192", # çç¥ } ], "failures": [] } ECS Exec ããã³ã³ããã®ã·ã§ã«ã«ã¢ã¯ã»ã¹ãã JShell ãã availableProcessors ãå®è¡ããŸãã $ aws ecs execute-command --cluster m5infrasurvey-poc-ecs-cluster --task 6218b4dd29c146a6ac120c5395a6e462 --container sandbox --interactive --command "sh" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-0dc2b2f03561dd7b9 # # jshell Dec 19, 2022 5:33:04 PM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. | Welcome to JShell -- Version 11.0.16.1 | For an introduction type: /help intro jshell> Runtime.getRuntime().availableProcessors() $1 ==> 1 jshell> /exit | Goodbye æ»ãå€ã 1 ã§ããããšã確èªããŸããã æ¯èŒãšããŠãEC2 ã€ã³ã¹ã¿ã³ã¹ ãšããŠèµ·åããŠãã Amazon Linux2 ã« Docker Server ãã€ã³ã¹ããŒã«ããåã Docker ã€ã¡ãŒãžãèµ·åããŠç¢ºèªããŠã¿ãŸãã docker exec ã³ãã³ãã§ã·ã§ã«ã«ã¢ã¯ã»ã¹ããŠãäžèšåæ§ã« JShell ãå®è¡ããŸãã $ docker exec -it sandbox "sh" # # lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 46 bits physical, 48 bits virtual CPU(s): 8 On-line CPU(s) list: 0-7 Thread(s) per core: 2 Core(s) per socket: 4 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz Stepping: 4 CPU MHz: 3416.106 BogoMIPS: 5999.99 Hypervisor vendor: KVM Virtualization type: full L1d cache: 128 KiB L1i cache: 128 KiB L2 cache: 4 MiB L3 cache: 24.8 MiB NUMA node0 CPU(s): 0-7 Vulnerability Itlb multihit: KVM: Mitigation: VMX unsupported Vulnerability L1tf: Mitigation; PTE Inversion Vulnerability Mds: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown Vulnerability Meltdown: Mitigation; PTI Vulnerability Mmio stale data: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown Vulnerability Retbleed: Vulnerable Vulnerability Spec store bypass: Vulnerable Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization Vulnerability Spectre v2: Mitigation; Retpolines, STIBP disabled, RSB filling Vulnerability Srbds: Not affected Vulnerability Tsx async abort: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe 1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq 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 3dnowpr efetch invpcid_single pti fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves ida arat pku ospke # # jshell Dec 20, 2022 9:07:44 AM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. | Welcome to JShell -- Version 11.0.16.1 | For an introduction type: /help intro jshell> Runtime.getRuntime().availableProcessors() $1 ==> 8 jshell> /exit | Goodbye ã€ã³ã¹ã¿ã³ã¹ ã¿ã€ã㯠c5.2xlarge ã§ããåèãšããŠäžèšã§ã¯ lscpu ãå®è¡ããŠããŸãã ã³ã³ããèµ·åæã« CPU ãªãã·ã§ã³ã¯æå®ããŠããªãããããã¹ãã® CPU ããã®ãŸãŸèŠããŠããŸãã availableProcessors() 㯠EC2 ã€ã³ã¹ã¿ã³ã¹ ã® vCPU æ°ãè¿åŽããŠãããECS/Fargate ãšã¯æåãç°ãªã£ãŠããŸãã cgroupã®cpu.sharesãã©ã¡ãŒã¿ ã³ã³ããä»®æ³åã«ããããªãœãŒã¹å²ãåœãŠã«å©çšãããcgroupã®cpuãµãã·ã¹ãã ã®sharesãã©ã¡ãŒã¿ã¯ãã³ã³ããã å©çšå¯èœãªCPUãªãœãŒã¹ã®ã¹ã±ãžã¥ãŒãªã³ã°ã«å©çšãããŸããDockerã§ã¯ run ã³ãã³ãã® --cpu-shares ãã©ã¡ãŒã¿ã§æå®ããŸãã å²å㯠cpu.shares ãã©ã¡ãŒã¿ã®å€ã 1024 ã§é€ç®ããå€ã§èšç®ãããŸãã Dockerã®å Žåã¯ãã®ãã©ã¡ãŒã¿ã«ããã©ã«ãã§ 1024 ãé©çšãããŸãã https://docs.docker.jp/config/container/resource_constraints.html#cfs ã³ã³ãããžã®é
åãå®ãããã®ã§ãããã©ã«ãå€ã¯1024 ã§ãã ã€ãŸãããã¹ãäžã§å®è¡ããã³ã³ããã1å°ã§ä»ã«ãªãœãŒã¹å¶éãä»äžãããã©ã¡ãŒã¿ãæå®ãããŠããªãå Žåãå²å㯠1024/1024=1 ãšãªããã¹ãã® CPUãªãœãŒã¹ãå
šãŠå©çšå¯èœãšãªããŸãã äžæ¹ãECSã§ã¯ããã©ã«ãå€ãšã㊠cpu.shares ã« 2 ãé©çšãããŸãã https://aws.amazon.com/jp/blogs/news/how-amazon-ecs-manages-cpu-and-memory-resources/ æ³šïŒ ã³ã³ããã« CPU ãŠããããæå®ããªãå ŽåãECS ã¯å
éšçã« cgroup ã«å¯Ÿã㊠2 ïŒ Linux ã«ãŒãã« ã蚱容ããæå°å€ïŒ ãšããå€ã® Linux CPU é
å (cpu.shares) ãèšå®ããŸãã Fargateã¿ã¹ã¯ã«å¯Ÿãã Java ã® -Xlog:os+container=trace ãªãã·ã§ã³ã䜿çšã㊠JVM ã®ãªãœãŒã¹èªèç¶æ³ãåºåãããã®ã以äžã«ãªããŸãã $ aws ecs execute-command --cluster m5infrasurvey-poc-ecs-cluster --task 83d8e044611d4d22bbeaf65d164af34f --container sandbox --interactive --command "/bin/sh" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-0dc479f32fcd9891d # # java -Xlog:os+container=trace -version [0.000s][trace][os,container] OSContainer::init: Initializing Container Support [0.001s][debug][os,container] Detected cgroups hybrid or legacy hierarchy, using cgroups v1 controllers [0.001s][trace][os,container] Path to /memory.use_hierarchy is /sys/fs/cgroup/memory/memory.use_hierarchy [0.001s][trace][os,container] Use Hierarchy is: 1 [0.001s][trace][os,container] Path to /memory.limit_in_bytes is /sys/fs/cgroup/memory/memory.limit_in_bytes [0.001s][trace][os,container] Memory Limit is: 9223372036854771712 [0.001s][trace][os,container] Non-Hierarchical Memory Limit is: Unlimited [0.001s][trace][os,container] Path to /memory.stat is /sys/fs/cgroup/memory/memory.stat [0.001s][trace][os,container] Hierarchical Memory Limit is: 8589934592 [0.001s][info ][os,container] Memory Limit is: 8589934592 [0.001s][trace][os,container] Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us [0.001s][trace][os,container] CPU Quota is: -1 [0.001s][trace][os,container] Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us [0.001s][trace][os,container] CPU Period is: 100000 [0.001s][trace][os,container] Path to /cpu.shares is /sys/fs/cgroup/cpu,cpuacct/cpu.shares [0.001s][trace][os,container] CPU Shares is: 2 [0.001s][trace][os,container] CPU Share count based on shares: 1 [0.001s][trace][os,container] OSContainer::active_processor_count: 1 [0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 1 [0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 1 # çç¥ å®éã« CPU Share is: 2 ãšåºåãããŠããããšã確èªã§ããŸããã 2/1024â0.002 ã®ããã³ã³ããã«å²ãåœãŠããã CPUãªãœãŒã¹æ°ã極端ã«å°ãªãã JVM ã¯å©çšå¯èœãª CPU æ°ã®æå°å€ã§ãã 1 ãé©çšããæåããããšå€æããŸãããECS/FargateãšDockerã«ãŠæåã®ç°ãªãç¹ã«ã説æãã€ããŸãã å¯Ÿå¿ ã³ã³ããå®çŸ©ã®cpuãã©ã¡ãŒã¿ã®æå® åã®ã»ã¯ã·ã§ã³ã§èª¬æããéãã cpu.shares ãããã©ã«ãã§ã¯ 2 ã§ããããšããã¿ã¹ã¯ãµã€ãºã«äŸãã1ã¹ã¬ããããå©çšã§ããªãäºè±¡ã®æ·±å±€çãªåå ã§ãããšããããŸããã ECSã«ãã㊠cpu.shares ãæå®ããã«ã¯ãã³ã³ããå®çŸ©ã® cpu ãã©ã¡ãŒã¿ãæå®ããã°è¯ãã§ããã¿ã¹ã¯å®çŸ©ã«ãããã¿ã¹ã¯ãµã€ãºã® cpu ãšã¯å¥ã®ãã©ã¡ãŒã¿ã§ããããšã«æ³šæããŠãã ããã ç§ã®æ€èšŒã§ã¯ç°å¢æ§ç¯ã« AWS CDK ãå©çšããã®ã§ã察å¿äŸãšã㊠ãœãŒã¹ã³ãŒã ã®äžéšã玹ä»ããŸãã å©çšããŠããããŒãžã§ã³ã¯ package.json ã®äžéšã®ç޹ä»ã§ä»£æ¿ããããŸãã { //çç¥ " devDependencies ": { " @types/jest ": " ^29.2.3 ", " @types/node ": " ^18.11.9 ", " @typescript-eslint/eslint-plugin ": " ^5.20.0 ", " @typescript-eslint/parser ": " ^5.20.0 ", " aws-cdk ": " ^2.51.0 ", " eslint ": " ^8.13.0 ", " eslint-config-prettier ": " ^8.5.0 ", " jest ": " ^29.3.1 ", " prettier ": " ^2.6.2 ", " ts-jest ": " ^29.0.3 ", " ts-node ": " ^10.9.1 ", " typescript ": " ^4.9.3 " } , " dependencies ": { " aws-cdk-lib ": " ^2.51.0 ", " constructs ": " ^10.0.0 ", " source-map-support ": " ^0.5.16 " } } const sandboxTaskdef = new TaskDefinition ( this , 'sandboxTaskdef' , { compatibility: Compatibility.FARGATE , networkMode: NetworkMode.AWS_VPC , family: ` ${ SYSTEM_NAME } - ${ props.m5Props.m5Env } -ecs-taskdef-sandbox` , executionRole: sandboxTaskRole , taskRole: sandboxTaskRole , cpu: '4096' , memoryMiB: '8192' , } ); sandboxTaskdef.addContainer ( 'sandbox' , { image: ContainerImage.fromEcrRepository ( Repository.fromRepositoryArn ( this , 'sandbox' , 'arn:aws:ecr:ap-northeast-1:XXXXXXXXXXXX:repository/m5infrasurvey-poc-ecr-sandbox' ) ), containerName: 'sandbox' , cpu: 1024 , // cpu.sharesã«èšå®ããã /*çç¥*/ } ); 宣èšãã TaskDefinition ã¯ã©ã¹ã® addContaier ã¡ãœããããã³ã³ããå®çŸ©ã® cpu ãã©ã¡ãŒã¿ãæå®ããŠããŸãã äžèšã®ã³ãŒãããããã€ããŠèµ·åãããFargateã¿ã¹ã¯ã® cpu.shares ãå®éã«ç¢ºèªããŠã¿ãŸãã ãŸãã¯èµ·åãããã¿ã¹ã¯ã®æ
å ±ã§ãã $ aws ecs describe-tasks --cluster m5infrasurvey-poc-ecs-cluster --tasks 46e1d6fd883c47419093ad0e84a41ad1 { "tasks": [ { # çç¥ "containers": [ { "containerArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:container/m5infrasurvey-poc-ecs-cluster/46e1d6fd883c4741 9093ad0e84a41ad1/342343c2-0d87-4cdf-b60a-4496307cfc33", "taskArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:task/m5infrasurvey-poc-ecs-cluster/46e1d6fd883c47419093ad0e84 a41ad1", "name": "sandbox", # çç¥ "managedAgents": [ { "lastStartedAt": "2022-12-21T17:30:48.947000+09:00", "name": "ExecuteCommandAgent", "lastStatus": "RUNNING" } ], "cpu": "1024" } ], "cpu": "4096", # çç¥ } ], "failures": [] } ã¿ã¹ã¯ãµã€ãºãšã¯å¥ã«ã³ã³ããå®çŸ©ãšã㊠"cpu": "1024" ãåæ ãããŠããããšã確èªããŸããã ç¶ããŠã JVM ãèªèãããªãœãŒã¹æ
å ±ãš availableProcessors ã®æ»ãå€ã確èªããŸãã $ aws ecs execute-command --cluster m5infrasurvey-poc-ecs-cluster --task 46e1d6fd883c47419093ad0e84a41ad1 --container sandbox --interactive --command "/bin/sh" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-0d914bdaa48aec635 # # java -Xlog:os+container=trace -version [0.000s][trace][os,container] OSContainer::init: Initializing Container Support [0.001s][debug][os,container] Detected cgroups hybrid or legacy hierarchy, using cgroups v1 controllers [0.001s][trace][os,container] Path to /memory.use_hierarchy is /sys/fs/cgroup/memory/memory.use_hierarchy [0.001s][trace][os,container] Use Hierarchy is: 1 [0.001s][trace][os,container] Path to /memory.limit_in_bytes is /sys/fs/cgroup/memory/memory.limit_in_bytes [0.001s][trace][os,container] Memory Limit is: 9223372036854771712 [0.001s][trace][os,container] Non-Hierarchical Memory Limit is: Unlimited [0.001s][trace][os,container] Path to /memory.stat is /sys/fs/cgroup/memory/memory.stat [0.001s][trace][os,container] Hierarchical Memory Limit is: 8589934592 [0.001s][info ][os,container] Memory Limit is: 8589934592 [0.001s][trace][os,container] Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us [0.001s][trace][os,container] CPU Quota is: -1 [0.001s][trace][os,container] Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us [0.001s][trace][os,container] CPU Period is: 100000 [0.001s][trace][os,container] Path to /cpu.shares is /sys/fs/cgroup/cpu,cpuacct/cpu.shares [0.001s][trace][os,container] CPU Shares is: 1024 [0.001s][trace][os,container] OSContainer::active_processor_count: 4 [0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 4 [0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 4 [0.037s][trace][os,container] Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us [0.038s][trace][os,container] CPU Quota is: -1 [0.038s][trace][os,container] Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us [0.038s][trace][os,container] CPU Period is: 100000 [0.038s][trace][os,container] Path to /cpu.shares is /sys/fs/cgroup/cpu,cpuacct/cpu.shares [0.038s][trace][os,container] CPU Shares is: 1024 [0.038s][trace][os,container] OSContainer::active_processor_count: 4 # çç¥ # # jshell Dec 21, 2022 5:55:00 PM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. | Welcome to JShell -- Version 11.0.16.1 | For an introduction type: /help intro jshell> Runtime.getRuntime().availableProcessors() $1 ==> 4 以äžã確èªã§ããŸããã CPU Shares is: 1024 ãšåºåããã cpu.shares ãæå³éãã«èšå®ãããŠããããš active_processor_count: 4 ãšåºåãããã¿ã¹ã¯ã®vCPUãšåå€ãèªèãããŠããããš availableProcessors ã®æ»ãå€ã 4 ãšåºåãããã¿ã¹ã¯ã®vCPUãšåå€ã§ããããš æåŸã«ãæ¬ä»¶ã®äºè±¡ãè§£æ¶ããŠããããäºè±¡ã®åçŸæ¹æ³ãšåãããã«ç¢ºèªããŸãã $ curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/greet ; echo everyone! hello!everyone! $ $ (curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/sleep ; echo done at `date`) & [1] 4454 $ (curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/sleep ; echo done at `date`) & [2] 4457 $ (curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/sleep ; echo done at `date`) & [3] 4460 $ $ curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/greet ; echo everyone! hello!everyone! ã¹ã¬ããããŒã«æ°ã¯ 4 ã«ãªã£ãŠããã®ã§ãäºè±¡ã®åçŸã«äœ¿çšãã /sandbox/sleep API ã 3 ãªã¯ ãšã¹ ãåãä»ãåŸãã /sandbox/greet API ããã¬ã¹ãã³ã¹ãååŸã§ããŠããŸããæ³å®éãã®çµæãåŸãããšãã§ããŸããã XX:ActiveProcessorCountãªãã·ã§ã³ã®å©çš åã®ã»ã¯ã·ã§ã³ã®å¯Ÿå¿ã§ã cpu.shares ã®èšå®æ¹æ³ãããããŸããã ããããªããã 18.0.2+ , 17.0.5+ , 11.0.17+ ããOpenJDKã«ãŠ cpu.shares ãçšããŠå©çšå¯èœãªCPUæ°ã®å¶åŸ¡ã廿¢ãã( 2 )ããã Java ã®ããŒãžã§ã³æ¬¡ç¬¬ã§åè¿°ããæ¹æ³ã§ã¯äºè±¡ãåçŸããŸãã ããã§ã Java ã®æ¡åŒµã©ã³ã¿ã€ã ãªãã·ã§ã³ã§ãã -XX:ActiveProcessorCount=N ãå©çšããŸãããã®ãã©ã¡ãŒã¿ãå©çšãããšã JVM ãèªèãã CPU ã®æ°ãäžæžãã§ããŸãã åè¿°ãã察å¿ã§ã¯ã³ã³ããã®ãªãœãŒã¹éãç°å¢ã«åãããŠåçã«å²ãåœãŠå¯èœã§ããããã¡ãã®å Žåã¯ç°å¢ããšã«ãã©ã¡ãŒã¿ã倿Žããå¿
èŠããããŸãã -XX:ActiveProcessorCount=N ãå©çšããã±ãŒã¹ã«ãããŠãã察å¿äŸãšã㊠AWS CDKã® ãœãŒã¹ã³ãŒã ã®äžéšã玹ä»ããŸãã const cpuNum = 4 ; const sandboxTaskdef = new TaskDefinition ( this , 'sandboxTaskdef' , { compatibility: Compatibility.FARGATE , networkMode: NetworkMode.AWS_VPC , family: ` ${ SYSTEM_NAME } - ${ props.m5Props.m5Env } -ecs-taskdef-sandbox` , executionRole: sandboxTaskRole , taskRole: sandboxTaskRole , cpu: String ( cpuNum * 1024 ), memoryMiB: '8192' , } ); sandboxTaskdef.addContainer ( 'sandbox' , { image: ContainerImage.fromEcrRepository ( Repository.fromRepositoryArn ( this , 'sandbox' , 'arn:aws:ecr:ap-northeast-1:XXXXXXXXXXXX:repository/m5infrasurvey-poc-ecr-sandbox' ) ), containerName: 'sandbox' , environment: { TZ: 'Asia/Tokyo' , JAVA_TOOL_OPTIONS: `-XX:ActiveProcessorCount= ${ cpuNum } ` , // ç°å¢å€æ°ã§-XX:ActiveProcessorCountãèšå® } , } ); ã¿ã¹ã¯ã«å²ãåœãŠã vCPU ã®æ°ãããããã宣èšããŠããïŒ cpuNum ïŒãã¿ã¹ã¯ãµã€ãºã® cpu ãã©ã¡ãŒã¿ãš -XX:ActiveProcessorCount= ã®å€ã«äœ¿çšããŸãã æ¬çªç°å¢ãšéçºç°å¢éã§ã¿ã¹ã¯ãµã€ãºã¯ç°ãªãããšãå€ãã®ã§ã -XX:ActiveProcessorCount= 㯠JAVA_TOOL_OPTIONS ç°å¢å€æ° ãå©çšããŠå€éšããæ³šå
¥ãã圢ã§ä»äžããã®ããã¿ãŒãšèããŸããã ãã®ããã« ã¯ã©ãŠã ã®ãµãŒãã¹ããªãœãŒã¹ã宣èšçã«æ§ç¯ã§ããç¹ããå€ããªããžã§ã¯ãçãåå©çšå¯èœãªãšãããIaCã®ã¡ãªããã§ããïŒ åã®ã»ã¯ã·ã§ã³ãšåãããã«åæ ãããã確èªããŸãã $ aws ecs execute-command --cluster m5infrasurvey-poc-ecs-cluster --task e4696c0103574ad0a07a8eabc1360087 --container sandbox --interactive --command "/bin/sh" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-0c5d73c5e08474f67 # # jshell Picked up JAVA_TOOL_OPTIONS: -XX:ActiveProcessorCount=4 Dec 20, 2022 6:58:07 PM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. | Welcome to JShell -- Version 11.0.16.1 | For an introduction type: /help intro jshell> Runtime.getRuntime().availableProcessors() $1 ==> 4 JAVA_TOOL_OPTIONS ç°å¢å€æ° ãé©çšãããŠããããšãããã³ã availableProcessors ã®æ»ãå€ãæå®ããå€ã«ãªã£ãŠããããšã確èªã§ããŸããã å®éã« API ã«ãªã¯ ãšã¹ ããè¡ãåäœç¢ºèªã¯åè¿°ãšåãçµæã«ãªã£ãããèšèŒã¯å²æããŸãã éåæåŠçãæ€èšãã åè¿°ãŸã§ã®å¯Ÿå¿ã¯ãã¿ã¹ã¯ã® vCPU ã 2 以äžã«èšå®ããããšãåæãšãªã£ãŠããŸãã åžžæå€æ°ã®ãªã¯ ãšã¹ ããåããã€ãããããªã¯ãŒã¯ããŒãã§ããã°ããã§ããããã以å€ã®å Žåã¯ãªãœãŒã¹ã«äœå°ãçºçãã³ã¹ãæé©åã®èšèšååã«åããŠããŸãã çæ³ã¯ãå¿
èŠæå°éã®ã¿ã¹ã¯ãµã€ãºãšã¿ã¹ã¯æ°ã§ ECS ãµãŒãã¹ãèµ·åããè² è·ã«å¿ããŠã¹ã±ãŒã«ããããšã§ãã ä»åã®çºç«¯ãšãªã£ããããªå¿çãŸã§æéãèŠãããããªåŠçã¯éåæã§å®è¡ããããšã§ãã¹ã¬ãããé·æéå æããããšãåé¿ãããšããæ¡ã§ãã AWS ã«ãããŠã¯ SQS ãš Lambda ãå©çšããŠã¡ãã»ãŒãžãã¥ãŒã€ã³ã°ã«ããéåæåŠçããµãŒãã¬ã¹ ã¢ãŒããã¯ã㣠ã§å®çŸããæ¹æ³ãç¥ãããŠããŸãã äžèšã®å³ã®äŸã§ã¯ãããã¯ãšã³ã API 㯠enqueue ã«æåããæç¹ã§ã¬ã¹ãã³ã¹ãè¿åŽãããããæ¬ä»¶ã®äºè±¡ãåé¿ãããšããæå³ã«ãªããŸãã éåæåããå Žå㯠API ã¯ã©ã€ã¢ã³ãåŽã«ããŒãªã³ã°ããªãã¬ãã·ã¥ã®ä»çµã¿ãå¿
èŠã«ãªãããã API 仿§ãšããŠèš±å®¹å¯èœãã®èª¿æŽãå¿
èŠãšãªãç¹ã«ã¯æ³šæãå¿
èŠã§ãã ãããã« ä»å㯠ECS/Fargate ã§çºçããäºè±¡ã«ã€ããŠç޹ä»ããããŸããã ä»åŸã¯ä»ã® ã¯ã©ãŠã ãããã€ãã®ã³ã³ããé¢é£ãµãŒãã¹ã«ãããäºè±¡ã®çºçæç¡ã«ã€ããŠã調æ»ããããšèããŠããŸãã æåŸãŸã§ã芧ããã ãããããšãããããŸãããçããŸè¯ãã幎ãïŒ ç§ãã¡ã¯äžç·ã«åããŠããã仲éãåéããŠããŸãïŒ éèæ©é¢ã®ãããªã客æ§ã«ãããŠã ã¯ã©ãŠã ãã¡ãŒã¹ããªã¢ãããŒãããã€ã¯ããµãŒãã¹ã®ãããªã¢ãã³ãªæè¡ã®æ¡çšãé²ã¿ã€ã€ãããŸãããèªèº«ã®ã€ã³ãã©ïŒ ã¯ã©ãŠã ã¹ãã«ã ãšã³ã¿ãŒãã©ã€ãº é åã§ã掻çšãããã»ææŠããããšããæ¹ãããã£ããããŸãããããã²ãå¿åãã ããïŒ éèã·ã¹ãã ãã€ã³ãã©ã»ã¢ãŒããã¯ã éèã·ã¹ãã ãã€ã³ãã©ãšã³ãžã㢠å·çïŒ å¯ºå±± èŒ (@terayama.akira) ãã¬ãã¥ãŒïŒ @mizuno.kazuhiro ïŒ Shodo ã§å·çãããŸãã ïŒ https://github.com/helidon-io/helidon/blob/helidon-2.x/webserver/webserver/src/main/java/io/helidon/webserver/ServerConfiguration.java#L58-L65 , https://github.com/helidon-io/helidon/blob/helidon-3.x/common/configurable/src/main/java/io/helidon/common/configurable/ServerThreadPoolSupplier.java#L54-L68 ↩ https://bugs.openjdk.org/browse/JDK-8281181 ↩