# ユニコーンの数、メモリ使用量、スワップの制限

**URL:** https://meta.discourse.org/t/limiting-the-number-of-unicorns-memory-usage-and-swapping/274954
**Category:** Self-hosting
**Tags:** server-resources
**Created:** [2023 年 8 月 13 日午後 4:33 UTC](https://meta.discourse.org/t/limiting-the-number-of-unicorns-memory-usage-and-swapping/274954 "2023-08-13T16:33:25Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![RBoy](https://avatars.discourse-cdn.com/v4/letter/r/2bfe46/32.png) [@RBoy](https://meta.discourse.org/u/RBoy)
#### Post date: [2023 年 8 月 13 日午後 4:33 UTC](https://meta.discourse.org/t/limiting-the-number-of-unicorns-memory-usage-and-swapping/274954/1 "2023-08-13T16:33:25Z")

</div>

私は小さなサーバー（RAM 1GB）と小さなサイト（公式のDiscourseインストールで8年近く稼働）を運営しています。望ましくないほどのディスクスワップが発生しているので、メモリ使用量を確認し始めました。

メモリ使用量を制限するため（そしてスワップを減らすため）、以前にユニコーンの数を2に設定したことに気づきました。Discourseのバージョンは `3.1.0` です。

 ![image](https://global.discourse-cdn.com/meta/original/4X/b/7/5/b756fdaf92e214877c63f5a21c0dbcff5db4fabe.png)

しかし、`htop` を実行すると、20個のユニコーンが実行されていることがわかります（ワーカー0に10個、ワーカー1に10個）。

 ![image](https://global.discourse-cdn.com/meta/original/4X/0/b/a/0ba77bcfebdb8b280762e3dddad0b63663a26675.png)

ここで何を見落としていますか？ `app.yml` では2と指定されているのに、なぜ20個のユニコーンが実行されているのでしょうか？

また、メモリ使用量を減らす他の方法はありますか？（例えば、`db_shared_buffers` を128MBに減らした場合の副作用はありますか？）Sidekiqのメモリ使用量を減らすことはできますか？

これは `vmstat 5 5` の結果です。  
 ![image](https://cdck-file-uploads-global.s3.dualstack.us-west-2.amazonaws.com/meta/original/4X/f/b/5/fb5c95c322559085f1dae3704d6545eb9ad9a697.png)

`free -h` の結果です。  
 ![image](https://cdck-file-uploads-global.s3.dualstack.us-west-2.amazonaws.com/meta/original/4X/6/d/8/6d8dba4fb4e914c885ca5578cdbabf49e2622989.png)

---

<div class="post-metadata">

### Author: ![Ed\_S](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ed_s/32/134015_2.png) [@Ed\_S](https://meta.discourse.org/u/Ed_S)
#### Post date: [2023 年 8 月 13 日午後 5:04 UTC](https://meta.discourse.org/t/limiting-the-number-of-unicorns-memory-usage-and-swapping/274954/2 "2023-08-13T17:04:11Z")

</div>

htop はスレッドではなくプロセスを表示していると思われます。いずれにしても、`ps uaxf|egrep unicorn.?worker` では 2 つのユニコーンしか表示されませんが、htop では表示されている内容はあなたと同じです。

また、私の free コマンドの結果もあなたと同じです。

```plaintext
# free -h
              total used free shared buff/cache available
Mem: 985M 782M 61M 60M 141M 32M
Swap: 2.0G 992M 1.0G

```

ちなみに、スワップが使用されているのを見ても、それ自体は問題ではありません。問題となるのは実際のスワッピング（ページング）です。`vmstat 5 5` を実行し、si と so の列を確認してみてください。

```plaintext
# vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r b swpd free buff cache si so bi bo in cs us sy id wa st
 0 0 1041832 63176 5716 127408 367 325 601 393 8 10 2 1 95 2 0
 0 0 1041576 60976 5724 127408 399 0 399 21 212 653 1 1 96 2 0
 0 0 1043544 77036 2296 120688 807 803 807 837 404 1144 1 2 94 3 0
 0 0 1043288 65040 3704 129476 254 0 2292 5 255 780 1 1 96 2 0
 0 0 1048736 81936 2916 119016 762 1499 919 1565 470 1171 3 2 90 5 0

```

1000 を超える値はできれば見たくありませんが、それほど心配はしていません。2 回目の実行では、はるかに落ち着いた状況が見られました。

```plaintext
# vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r b swpd free buff cache si so bi bo in cs us sy id wa st
 0 0 1048452 82712 2532 120848 367 325 601 393 8 10 2 1 95 2 0
 0 0 1047684 74552 2548 124816 285 0 1049 10 230 655 2 1 95 2 0
 0 0 1046660 66556 3692 129008 196 0 1261 16 219 672 1 1 96 2 0
 1 0 1046404 65812 3700 129284 54 0 97 13 137 364 1 0 98 0 0
 0 0 1046148 65280 3700 129288 50 0 50 3 132 344 1 0 98 0 0

```

編集: htop の H キーを押すと、スレッドとプロセスの表示を切り替えることができます。

```plaintext
  CPU[0.0%] Tasks: 66; 1 running
  Mem[||||||||||||||||||||||||||||||||||||||||||||||||||824M/985M] Load average: 0.19 0.12 0.05
  Swp[|||||||||||||||||||||||||||||| 1015M/2.00G] Uptime: 52 days, 00:50:42

  PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
13246 1000 20 0 966M 362M 6448 S 0.0 36.8 51:01.52 unicorn worker[0] -E production -c config/unicorn.conf.rb
13237 1000 25 5 1004M 194M 3780 S 0.0 19.8 22:38.19 sidekiq 6.5.9 discourse [0 of 5 busy]
13258 1000 20 0 919M 70176 3632 S 0.0 7.0 5:02.87 unicorn worker[1] -E production -c config/unicorn.conf.rb
12412 systemd-r 20 0 212M 60928 56916 S 0.0 6.0 0:00.23 postgres: 13/main: discourse discourse [local] idle
12818 systemd-r 20 0 212M 39228 34868 S 0.0 3.9 0:00.07 postgres: 13/main: discourse discourse [local] idle
12719 systemd-r 20 0 211M 28400 25336 S 0.0 2.8 0:00.03 postgres: 13/main: discourse discourse [local] idle
13117 1000 20 0 541M 13768 2048 S 0.0 1.4 1:08.11 unicorn master -E production -c config/unicorn.conf.rb

```

編集: `db_shared_buffers: "128MB"` はかなり早い段階で設定しましたが、問題は発生していません。

---

<div class="post-metadata">

### Author: ![RBoy](https://avatars.discourse-cdn.com/v4/letter/r/2bfe46/32.png) [@RBoy](https://meta.discourse.org/u/RBoy)
#### Post date: [2023 年 8 月 13 日午後 6:47 UTC](https://meta.discourse.org/t/limiting-the-number-of-unicorns-memory-usage-and-swapping/274954/3 "2023-08-13T18:47:31Z")

</div>

ありがとうございます。大変参考になりました。ユニコーンワーカーを1つだけにする場合のデメリットは何でしょうか？応答時間は改善されるでしょうか、それとも悪化するでしょうか（ユニコーンワーカーは1つの着信接続にしか対応できないのでしょうか？つまり、2つのワーカーがあれば単一の着信接続の処理は速くなるのでしょうか？）、1分あたりの接続数がわずかであると仮定した場合です。

ウェブサイトを閲覧しているとき、`vmstat 5 5` は次のようになります。スワッピングを減らすための提案はありますか（スワップネスを10に設定しました）？

 ![image](https://global.discourse-cdn.com/meta/original/4X/4/1/7/41744b7445229b79407932f3cc417ca69b5dd8ac.png)

編集：パフォーマンスに影響を与えることなく、Sidekiqのメモリ使用量を削減する方法はありますか？

---

<div class="post-metadata">

### Author: ![Ed\_S](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ed_s/32/134015_2.png) [@Ed\_S](https://meta.discourse.org/u/Ed_S)
#### Post date: [2023 年 8 月 13 日午後 9:57 UTC](https://meta.discourse.org/t/limiting-the-number-of-unicorns-memory-usage-and-swapping/274954/4 "2023-08-13T21:57:35Z")

</div>

RAMを増設すればサイトは確実に速くなるでしょう。しかし、応答時間が問題でなければ、問題ありません。ご自身のコスト/ベネフィットの計算式を見てみてください。

[MKJの意見によるDiscourseデプロイメント設定](https://meta.discourse.org/t/mkjs-opinionated-discourse-deployment-configuration/193355)を読むと興味深いかもしれません。システムレベルのカーネル調整がいくつかあり、それは良い考えです。それが違いを生むかどうかは分かりません。

分かりませんが、ユニコーンはそれぞれ1つのリクエストを処理できると思います。したがって、ユニコーンが1つしかなく、最初の処理が終わる前に2番目のリクエストが入ってくるほどのトラフィックがある場合、2番目のリクエストは待たなければなりません。htopの出力を見ると、1つのユニコーンが他のユニコーンの10倍のCPU時間を消費していることが分かります。これは、私のフォーラムが90％の時間でユニコーンが1つで済む必要があり、10％の時間で2番目のユニコーンが役立つことを意味すると考えられます。3つ目のユニコーンを追加する必要性を感じていませんし、1つに減らしてもフォーラムのメンバーには大きな影響はないかもしれません。しかし、減らす理由はありません。メモリを使用するかもしれませんが、アイドル状態であればスワップアウトされるでしょう。大したことではありません。仮想メモリシステムに任せましょう。

編集：swappinessを調整したことはありません。60のままのようです。より積極的なスワップが、I/Oバッファのためにメモリをより多く解放するのに役立つかもしれません。分かりません。

---

<div class="post-metadata">

### Author: ![nordize](https://avatars.discourse-cdn.com/v4/letter/n/c68b51/32.png) [@nordize](https://meta.discourse.org/u/nordize)
#### Post date: [2023 年 11 月 11 日午後 8:14 UTC](https://meta.discourse.org/t/limiting-the-number-of-unicorns-memory-usage-and-swapping/274954/5 "2023-11-11T20:14:27Z")

</div>

`db_shared_buffers` と `UNICORN_WORKERS` を変更した場合、`./launcher rebuild app` で再構築せずに再起動する方法はありますか？
