2022 年 6 月の読書メモを書いてないけど読んだ本 (2 冊)

読書メモ: 子どもに伝わるスゴ技大全 カリスマ保育士てぃ先生の子育てで困ったら、これやってみ!

先日てぃ先生の子育て本を読んだが、それ以降、子どもにイライラすることも減り、関係もよくなった。もう一冊の本も読んでみた。

読書時間は 2 時間くらい。固定レイアウトでマーカーが引けなかった。

全体的な感想

スゴ技の本は 40 のスゴ技が書かれていたが、この本では、おしたく、とかお片づけとか、お食事とか、よくある場面毎に 127 のポイントが書かれている。書いてあることはスゴ技の本と重なっている。とても読みやすく、サクッと読める。とても読みやすく、サクッと読める。すぐに実践してみたいと思うことがたくさん書かれている。

3 つに要約

127 もポイントがあり、要約が難しいが、重要なメッセージは以下 3 つと思う。

  • 子どもが楽しくなるゲーム要素を入れることで、やって欲しいことをスムーズにやってもらえる。
  • 子どもはまだまだ子どもであり、大人が思っているよりも理解力がまだ乏しいので、それに合わせた声のかけ方が必要。
  • 子どもは甘えたがっており、ちゃんと見てあげて、スキンシップをして、愛情表現してあげることが大切。

気になった部分の引用

10 大人が自分の実況をしつつ声をかけると、こどももつられる

早く準備をして欲しいが、なかなかやってくれないことは多いので、是非やってみたい。

11 片づけたものの数をいうだけで進む

片づけを全然してくれないので、これも是非やってみたい。

18 子どもを主人公にしてストーリーを実況する

10 番のポイントとちょっと似ているが、これもお片づけをやってもらうために、是非やってみたい。

21 スマホを使った食事に集中するウラ技

自撮りアプリで子どもをウサギに返信させるとにんじんを食べてくれるらしい。自撮りアプリは確かに大好きなので、是非試してみたい。

78 「それダメ!」ではなく、やることを具体的に伝える

例えばお部屋を走っていたら「走らないで!」→「歩こうね」。

まさに、「走らないで!」といっているので、伝え方を変えたいと思った。

お水をこぼしたときなら、「なんでお水こぼしたの!」ではなく「お水こぼれちゃったね、何があったの?」と聞いてあげると、子どもは、自分だけではなくて、自分を含めた環境で「何があったの?」と聞かれていると思って、「ひじが当たっちゃったの」というように、起こったことを言いやすくなります。

確かに「なんで○○したの!!」は言ってしまいがちなので、言い方を変えたいと思った。

子どもが、お友だちをたたいてしまったり、お友だちが使っていたおもちゃをとってしまったりーーそんなとき僕たち大人はよく、「自分がされたらどう思う?」とか「相手の子は悲しいんじゃないかな?」と、気持ちを察するように促す言葉をかけることがありますが、じつはこの言葉、子ども達にはほぼ理解できていません。

ではどうすればいいかというと、「自分がされたらどう思う?」ではなく、「ママ(パパ)がたたかれたらどう思う?」と聞いたほうが子どもには響きます。

子どもが他の子をたたいたりおもちゃを取ってしまうのは結構困っていることで、まさに「自分がされたらどう思う?」と聞いてしまっていた。実践してみたい。

読書メモ: 無駄な仕事が全部消える超効率ハック

仕事の効率を上げるヒントになればと思い読んだ本。

304 ページ、平均読書時間は 3 時間 41 分の本で、自分の場合は 3 時間半くらい。

全体的な感想

58 個の仕事に役立つハックが載っている。うち 1 個は別途 RDF をダウンロードする必要があり、本の中では 57 個が述べられている。各ハックの冒頭によくありがちな課題の例が添えられているが、まさに自分の課題としても当てはまると感じるものが多い。それぞれのハックは、なんとなく実践していたり、他の本で読んだこととがある気がするものが多く、ものすごく新しいものは少なかったように思う。OLP を言い換えたものだなと思うものも多く、OLP はすごいなと改めて思った。58 個もあると覚えられないが、16 個だったらギリギリ覚えられる。

3 つのポイントに要約

  • 当事者意識を持ち、主体的に動くことで、思考力が高まり、コントローラブルなことが増える。
  • どうせ正解はないので、不安に思っても意味はなく、やってみて経験をするべき。
  • 情報が簡単に手に時代では、情報は武器にならないので、簡単には鍛えられない思考力や経験が武器になる。

気になった部分の引用

Hack 01 能動的な時間 → 主体的な時間

できるだけ「他人に振り回される時間」を減らし、「自分でコントロールできる主体的な時間」を増やさなければなりません。

ちきりん氏が、アンコントローラブルなことに悩んでも仕方がないので、コントローラブルなことに注力すべきと行っていたが、それと少し似ている。ここでは、主体的に動くことで、コントロール可能なことが増えるというハックで、そのためには当事者意識が大事だと書かれている。これは OLP でいう Ownership のこと。

Hack 04 悩む → 決める

どのような判断も、結局は「やってみなければわからない」のですから、必要最低限の情報が収集できたら早めに判断・行動するクセをつけることが重要です。

あらゆるビジネスは、過去ではなく未来に向けてなされます。だとすれば「判断する前」に正解が決まっているわけではなく「判断した後」にどう動くかで、正解になるかどうかが決まるのです。

正解などわからないので、悩んでも仕方がないことは本の中で繰り返し主張されていた。OLP でいうと Bias for Action 。そして悩まずに、一度決めたらやりきるということも一緒に述べられていて、これは Have Backbone; Disagree and Commit 。

Hack 06 進め方 → 背景

したがって、上司から頼み事をされたときは、部下であるあなたの側から「その頼まれ事が生じた、そもそもの背景」を確認する習慣をつけましょう。

これは OLP でいう Customer Obsession で、真のニーズを考えるというのは実践しようとしている、はず。

Hack 18 説明する → 質問する

多くのビジネスパーソンは「わかってもらいたい」「理解してもらいたい」という気持ちが強すぎて、「つい話しすぎてしまう」というミスを犯しがちです。

人は、質問されると瞬時に「思考のスイッチ」が入ります。したがって、質問する側は適切な質問を投げかけることで、あたかも相手の頭の中を遠隔操作するかのように思考のスイッチを入れ、情報を引き出すことが可能になります。

お客様に説明をする機会を多くあるが、一生懸命説明してしまいがち。質問によって相手の頭の中を操作するというのは、難易度は高そうだが、なるほどと思った。

Hack 28 充実させる → シンプルにする

当事者意識が強ければ強いほど、読み手の立場から見た客観的なものの見方ができなくなり、資料の分量が多くなってしまいがちです。資料の作成者はたいていの場合、案件の当事者ですから、内容について誰よりも深く考え理解しているため、つい自分が持っているありったけの情報を詰め込んでしまう傾向があります。

読み手の時間を奪わない、シンプルで無駄のない資料をつくることができれば、資料作成の時間を短くできるだけでなく、読み手の読み込む時間も減らすことができるので、資料作成の生産性は劇的に向上します。

これはとても思い当たるところがある。よかれと思って詰め込んでしまっているが、読み手の時間を奪っているという意識を持っていなかった。

Hack 37 インプット → アウトプット

インプットは失敗がなく、「やった気」にもなれるため、勉強熱心な人には心地よく感じられるはずです。しかし、それがアウトプットにつながらないなら、成果を生み出すことはできず、学びの生産性は低いままです。

まさに資格取得とか好きであり、耳が痛い。

Hack 41 知識 → 経験

まずは打席に立つ必要があります。そして打席に立つ頻度が多ければ多いほど、数多くの「ヒットを打つための勘所」が蓄積されていき、財産になっていくはずです。

たとえば、あなたが「社内の大きなプロジェクト」を任されたとしましょう。最も致命的な失敗は「プロジェクトが途中で頓挫してしまう」ことですが、だからといって、会社が倒産するわけでもなければ、誰かが死ぬわけでもありません。

打席に立って、経験を積む必要がある。勇気が必要だが、よくよく考えてみれば、失敗したって誰かが死ぬわけでもないと言われば確かにその通りで、勇気がもらえる。

Hack 48 正解にこだわる → 仮説で走る

このようなときは「この世の中に〝正解〟など存在しない。未来に向けた〝可能性〟があるだけ」と考えてみてください。「どこかに正解がある」という固定観念はさまざまな弊害を生み出してしまいます。

どうせ正解などないのだから、悩んでもしょうがないというのはこれも勇気がもらえる。ちょうど慣れない工数見積もりをやっていて、自分の見積もりが妥当なのか分からずいろんな人に相談してきたりしていた。人に答えを聞くというのは自分で考えることを放棄する主体性のない行為とも書かれていて、確かにそうだと思った。

タスク定義を CLI で更新する

Fargate タスク定義に ephemeralStorage を設定しようとしたが、マネコンからはできず、CLI でやったメモ。マネコンではいじれないパラメータを変えたいときに汎用的に使えそう。

タスク定義をダウンロードする。

TASK_DEFINITION="hogehoge"
aws ecs describe-task-definition --task-definition ${TASK_DEFINITION} | jq -r '.taskDefinition | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.compatibilities) | del(.registeredAt) | del(.registeredBy)' > task.json

必要な修正を加える。

タスク定義を更新する。

aws ecs register-task-definition --family ${TASK_DEFINITION} --cli-input-json file://task.json

参考

ECS のリソース設定の理解

この AWS ブログを翻訳しながら理解をしたことのメモ。

参考リンク

準備

適当に ECS on EC2 のクラスターを用意する。

Terraform で作成するサンプルはこちら。

この環境のコンテナインスタンスは m6i.large でタスクが何も動いていない状態では以下の容量がある。

コンテナインスタンスの利用可能な容量との関係

以下のパラメータを設定したタスクを起動する。

設定 設定値
タスク CPU 768
タスクメモリ 768 MiB
コンテナ定義の CPU ユニット 512
コンテナ定義の memory 512 MiB
コンテナ定義の memoryReservation 256 MiB

いずれの設定値も予約になるので、コンテナインスタンスの利用可能な容量から引かれる。この場合、2048 - 768 = 1280 CPU ユニット、7833 - 768 = 7065 MiB が利用可能となっている。より上位で設定したものが予約となる。

タスクのスケジュール時には利用可能な容量がないとスケジュールされない。

cgroup を確認する

コンテナインスタンスにログインして確認する。

コンテナを確認すると、コンテナの 1 つ上の階層に cgroup がいることがわかる。これがタスクの cgroup と思われる。

[root@ip-10-0-11-145 ~]# docker ps
CONTAINER ID   IMAGE                            COMMAND                  CREATED             STATUS                       PORTS     NAMES
55dd991455cf   nginx                            "/docker-entrypoint.…"   2 minutes ago       Up 2 minutes                 80/tcp    ecs-task-size-test-1-nginx-ec8582fc88fab49b3e00
2db761b725bb   amazon/amazon-ecs-agent:latest   "/agent"                 About an hour ago   Up About an hour (healthy)             ecs-agent
[root@ip-10-0-11-145 ~]# docker inspect 55dd991455cf --format '{{ .HostConfig.CgroupParent }}'
/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10
[root@ip-10-0-11-145 ~]#

タスクとコンテナの cgroup を確認する。

[root@ip-10-0-11-145 ~]# ls -l /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10
total 0
drwxr-xr-x 2 root root 0 Jun 17 01:52 55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca
-rw-r--r-- 1 root root 0 Jun 17 02:05 cgroup.clone_children
-rw-r--r-- 1 root root 0 Jun 17 02:05 cgroup.procs
-rw-r--r-- 1 root root 0 Jun 17 01:52 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jun 17 01:52 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.shares
-r--r--r-- 1 root root 0 Jun 17 02:05 cpu.stat
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.stat
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_all
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_sys
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_user
-rw-r--r-- 1 root root 0 Jun 17 02:05 notify_on_release
-rw-r--r-- 1 root root 0 Jun 17 02:05 tasks
[root@ip-10-0-11-145 ~]# ls -l /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca
total 0
-rw-r--r-- 1 root root 0 Jun 17 02:05 cgroup.clone_children
-rw-r--r-- 1 root root 0 Jun 17 01:52 cgroup.procs
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jun 17 02:05 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jun 17 01:52 cpu.shares
-r--r--r-- 1 root root 0 Jun 17 01:52 cpu.stat
-r--r--r-- 1 root root 0 Jun 17 01:52 cpuacct.stat
-rw-r--r-- 1 root root 0 Jun 17 01:52 cpuacct.usage
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_all
-r--r--r-- 1 root root 0 Jun 17 01:52 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_sys
-r--r--r-- 1 root root 0 Jun 17 02:05 cpuacct.usage_user
-rw-r--r-- 1 root root 0 Jun 17 02:05 notify_on_release
-rw-r--r-- 1 root root 0 Jun 17 02:05 tasks
[root@ip-10-0-11-145 ~]# ls -l /sys/fs/cgroup/memory/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10
total 0
drwxr-xr-x 2 root root 0 Jun 17 01:52 55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca
-rw-r--r-- 1 root root 0 Jun 17 02:02 cgroup.clone_children
--w--w--w- 1 root root 0 Jun 17 02:02 cgroup.event_control
-rw-r--r-- 1 root root 0 Jun 17 02:02 cgroup.procs
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.failcnt
--w------- 1 root root 0 Jun 17 02:02 memory.force_empty
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.failcnt
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.max_usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.slabinfo
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.tcp.failcnt
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.tcp.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.tcp.max_usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.tcp.usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.kmem.usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.max_usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.memsw.failcnt
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.memsw.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.memsw.max_usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.memsw.usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.move_charge_at_immigrate
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.numa_stat
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.oom_control
---------- 1 root root 0 Jun 17 02:02 memory.pressure_level
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.soft_limit_in_bytes
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.stat
-rw-r--r-- 1 root root 0 Jun 17 02:02 memory.swappiness
-r--r--r-- 1 root root 0 Jun 17 02:02 memory.usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.use_hierarchy
-rw-r--r-- 1 root root 0 Jun 17 02:02 notify_on_release
-rw-r--r-- 1 root root 0 Jun 17 02:02 tasks
[root@ip-10-0-11-145 ~]# ls -l /sys/fs/cgroup/memory/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca
total 0
-rw-r--r-- 1 root root 0 Jun 17 02:04 cgroup.clone_children
--w--w--w- 1 root root 0 Jun 17 01:52 cgroup.event_control
-rw-r--r-- 1 root root 0 Jun 17 01:52 cgroup.procs
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.failcnt
--w------- 1 root root 0 Jun 17 02:04 memory.force_empty
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.failcnt
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.max_usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 02:04 memory.kmem.slabinfo
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.tcp.failcnt
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.tcp.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.tcp.max_usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.tcp.usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 01:52 memory.kmem.usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.max_usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.memsw.failcnt
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.memsw.limit_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.memsw.max_usage_in_bytes
-r--r--r-- 1 root root 0 Jun 17 01:52 memory.memsw.usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:04 memory.move_charge_at_immigrate
-r--r--r-- 1 root root 0 Jun 17 02:04 memory.numa_stat
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.oom_control
---------- 1 root root 0 Jun 17 02:04 memory.pressure_level
-rw-r--r-- 1 root root 0 Jun 17 01:52 memory.soft_limit_in_bytes
-r--r--r-- 1 root root 0 Jun 17 01:52 memory.stat
-rw-r--r-- 1 root root 0 Jun 17 02:04 memory.swappiness
-r--r--r-- 1 root root 0 Jun 17 01:52 memory.usage_in_bytes
-rw-r--r-- 1 root root 0 Jun 17 02:04 memory.use_hierarchy
-rw-r--r-- 1 root root 0 Jun 17 02:04 notify_on_release
-rw-r--r-- 1 root root 0 Jun 17 02:04 tasks
[root@ip-10-0-11-145 ~]#

CPU サブシステム

CPU 設定を確認する。コンテナの CPU ユニットは docker run の --cpu-shares にマッピングされ、値が反映されている。タスクのほうは 1024 は固定値となっている。

[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/cpu.shares
1024
[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca/cpu.shares
512
[root@ip-10-0-11-145 ~]#

cpu.cfs_period_us と cpu.cfs_quota_us を確認すると、1024 に対して 75000/100000 が絶対値となり、タスクサイズで設定した 768 がここに反映されているように見える。

[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/cpu.cfs_period_us
100000
[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/cpu.cfs_quota_us
75000
[root@ip-10-0-11-145 ~]#

コンテナのほうは制限が設けられていない。

[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca/cpu.cfs_period_us
100000
[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/cpu/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca/cpu.cfs_quota_us
-1
[root@ip-10-0-11-145 ~]#

memory サブシステム

タスクサイズに指定した値はハード制限となり、memory.limit_in_bytes に指定されている。コンテナ定義で指定した memorymemoryReservation も、それぞれ memory.limit_in_bytesmemory.soft_limit_in_bytes に反映されている。

[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/memory/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/memory.limit_in_bytes
805306368
[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/memory/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/memory.soft_limit_in_bytes
9223372036854771712
[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/memory/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca/memory.limit_in_bytes
536870912
[root@ip-10-0-11-145 ~]# cat /sys/fs/cgroup/memory/ecs/32d0f0bd1fb04a2b8e93ebb09da24a10/55dd991455cfc823ad07271e30f52fb8e2ac6717adb5265bacaef40dd3252eca/memory.soft_limit_in_bytes
268435456
[root@ip-10-0-11-145 ~]#

なるべく設定しない場合の値の確認

以下のパラメータを設定したタスクを起動する。メモリに関してはどこかでの設定が必須。

設定 設定値
タスク CPU 設定なし
タスクメモリ 設定なし
コンテナ定義の CPU ユニット 設定なし
コンテナ定義の memory 設定足
コンテナ定義の memoryReservation 256 MiB

タスクの cgroup を確認する。

[root@ip-10-0-11-24 ~]# docker ps
CONTAINER ID   IMAGE                            COMMAND                  CREATED          STATUS                 PORTS     NAMES
e518b184b577   nginx                            "/docker-entrypoint.…"   39 seconds ago   Up 38 seconds          80/tcp    ecs-task-size-test-2-1-nginx-dec6fdb1c0c8ac9e4800
6f53f5cd2e54   amazon/amazon-ecs-agent:latest   "/agent"                 2 hours ago      Up 2 hours (healthy)             ecs-agent
[root@ip-10-0-11-24 ~]# docker inspect e518b184b577 --format '{{ .HostConfig.CgroupParent }}'
/ecs/08c18cf2897547da883591f93b4d170f
[root@ip-10-0-11-24 ~]# ls -l /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/
total 0
-rw-r--r-- 1 root root 0 Jun 17 02:27 cgroup.clone_children
-rw-r--r-- 1 root root 0 Jun 17 02:27 cgroup.procs
-rw-r--r-- 1 root root 0 Jun 17 02:27 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jun 17 02:27 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jun 17 02:27 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jun 17 02:27 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jun 17 02:24 cpu.shares
-r--r--r-- 1 root root 0 Jun 17 02:27 cpu.stat
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.stat
-rw-r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage_all
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage_sys
-r--r--r-- 1 root root 0 Jun 17 02:27 cpuacct.usage_user
drwxr-xr-x 2 root root 0 Jun 17 02:24 e518b184b577c9b2644b94a81d12254edee651a0178173e2a607131a48d30ce1
-rw-r--r-- 1 root root 0 Jun 17 02:27 notify_on_release
-rw-r--r-- 1 root root 0 Jun 17 02:27 tasks
[root@ip-10-0-11-24 ~]#

CPU サブシステム

CPU を設定しない場合は 2 が設定される。これは Linux カーネルが許容する最小値であるため。

[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/cpu.shares
2
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/cpu.cfs_period_us
100000
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/cpu.cfs_quota_us
-1
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/e518b184b577c9b2644b94a81d12254edee651a0178173e2a607131a48d30ce1/cpu.shares
2
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/e518b184b577c9b2644b94a81d12254edee651a0178173e2a607131a48d30ce1/cpu.cfs_period_us
100000
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/cpu/ecs/08c18cf2897547da883591f93b4d170f/e518b184b577c9b2644b94a81d12254edee651a0178173e2a607131a48d30ce1/cpu.cfs_quota_us
-1
[root@ip-10-0-11-24 ~]#

memory サブシステム

設定していないところは上限とおぼしき値が設定されている。

[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/memory/ecs/08c18cf2897547da883591f93b4d170f/memory.limit_in_bytes
9223372036854771712
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/memory/ecs/08c18cf2897547da883591f93b4d170f/memory.soft_limit_in_bytes
9223372036854771712
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/memory/ecs/08c18cf2897547da883591f93b4d170f/e518b184b577c9b2644b94a81d12254edee651a0178173e2a607131a48d30ce1/memory.limit_in_bytes
9223372036854771712
[root@ip-10-0-11-24 ~]# cat /sys/fs/cgroup/memory/ecs/08c18cf2897547da883591f93b4d170f/e518b184b577c9b2644b94a81d12254edee651a0178173e2a607131a48d30ce1/memory.soft_limit_in_bytes
268435456
[root@ip-10-0-11-24 ~]#

EC2 インスタンスのユーザーデータの確認

マネジメントコンソールで EFS をマウントする EC2 インスタンスを作成すると、ユーザーデータを勝手に作ってくれるが、Terraform で作る場合には自分で書かなければいけないので、既存のインスタンスのユーザーデータを確認する方法のメモ。

$ aws ec2 describe-instance-attribute --attribute userData --instance-id i-0f2510be2315677bc | jq -r '.UserData.Value' | base64 --decode
#cloud-config
package_update: true
package_upgrade: true
runcmd:
- yum install -y amazon-efs-utils
- apt-get -y install amazon-efs-utils
- yum install -y nfs-utils
- apt-get -y install nfs-common
- file_system_id_1=fs-0a662024583f1a679
- efs_mount_point_1=/mnt/efs/fs1
- mkdir -p "${efs_mount_point_1}"
- test -f "/sbin/mount.efs" && printf "\n${file_system_id_1}:/ ${efs_mount_point_1} efs tls,_netdev\n" >> /etc/fstab || printf "\n${file_system_id_1}.efs.ap-northeast-1.amazonaws.com:/ ${efs_mount_point_1} nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev 0 0\n" >> /etc/fstab
- test -f "/sbin/mount.efs" && grep -ozP 'client-info]\nsource' '/etc/amazon/efs/efs-utils.conf'; if [[ $? == 1 ]]; then printf "\n[client-info]\nsource=liw\n" >> /etc/amazon/efs/efs-utils.conf; fi;
- retryCnt=15; waitTime=30; while true; do mount -a -t efs,nfs4 defaults; if [ $? = 0 ] || [ $retryCnt -lt 1 ]; then echo File system mounted successfully; break; fi; echo File system not available, retrying to mount.; ((retryCnt--)); sleep $waitTime; done;

なお、これをユーザーデータに入れる際には変数 ${hogehoge} 部分のエスケープが必要。変数を渡したいところもある。エスケープしたいところは $$ のようにする。

resource "aws_instance" "this" {
  ami                         = data.aws_ssm_parameter.this.value
  instance_type               = "t3.large"
  subnet_id                   = var.public_subnet_a_id
  vpc_security_group_ids      = [aws_security_group.this.id]
  key_name                    = var.key_name
  associate_public_ip_address = true
  iam_instance_profile        = aws_iam_instance_profile.this.id

  tags = {
    Name = "${var.app_name}-bastion"
  }

  user_data = <<EOF
#cloud-config
package_update: true
package_upgrade: true
runcmd:
- yum install -y amazon-efs-utils
- apt-get -y install amazon-efs-utils
- yum install -y nfs-utils
- apt-get -y install nfs-common
- file_system_id_1=${var.efs_file_system_id}
- efs_mount_point_1=/mnt/efs/fs1
- mkdir -p "$${efs_mount_point_1}"
- test -f "/sbin/mount.efs" && printf "\n$${file_system_id_1}:/ $${efs_mount_point_1} efs tls,_netdev\n" >> /etc/fstab || printf "\n$${file_system_id_1}.efs.ap-northeast-1.amazonaws.com:/ $${efs_mount_point_1} nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev 0 0\n" >> /etc/fstab
- test -f "/sbin/mount.efs" && grep -ozP 'client-info]\nsource' '/etc/amazon/efs/efs-utils.conf'; if [[ $? == 1 ]]; then printf "\n[client-info]\nsource=liw\n" >> /etc/amazon/efs/efs-utils.conf; fi;
- retryCnt=15; waitTime=30; while true; do mount -a -t efs,nfs4 defaults; if [ $? = 0 ] || [ $retryCnt -lt 1 ]; then echo File system mounted successfully; break; fi; echo File system not available, retrying to mount.; ((retryCnt--)); sleep $waitTime; done;
EOF
}

2022 年 5 月の読書メモを書いてないけど読んだ本 (2 冊)