質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
キャッシュ

キャッシュはドキュメントやデータを一時的に保管するもので、アクセス処理時間を短くするために使用されます。

memcached

memcached は、汎用の分散型メモリキャッシュサーバです。

Q&A

解決済

3回答

408閲覧

キャッシュサーバを使う場面について。

takuyaKK

総合スコア37

キャッシュ

キャッシュはドキュメントやデータを一時的に保管するもので、アクセス処理時間を短くするために使用されます。

memcached

memcached は、汎用の分散型メモリキャッシュサーバです。

0グッド

0クリップ

投稿2021/07/17 08:11

memchachedのようなキャッシュサーバを使う場面についての質問です。

キャッシュサーバは、データベースへの問い合わせ結果をキャッシュとしてメモリ上に保存しておきたい時に使いますよね?

でも例えばphpアプリケーションを作っているとして、サーバ上で動いているphpのプロセスが一つしかなくて、メモリの容量もデータベースの容量と同じくらいの場合は、わざわざキャッシュサーバを使わなくても、osが勝手にメモリ上にキャッシュしておいてくれるから、キャッシュサーバは必要ないのかなと思ったのですがどうでしょうか?

逆にfastCGIとかを使っていて、そのサーバーで複数のphpプロセスが動作するようになっている場合は、一つのプロセスが使えるメモリの量が減って、データベースのデータがキャッシュに乗る量も減り、複数のプロセスが同じデータをキャッシュすることも発生するから、キャッシュサーバを使って複数プロセスでキャッシュを共有する必要が出てくるのかなと思ったのですがどうでしょうか?

認識が間違っていたら教えて頂けると幸いです????‍♂️

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

キャッシュサーバは、データベースへの問い合わせ結果をキャッシュとしてメモリ上に保存しておきたい時に使いますよね?

メモリにキャッシュしたい時に使います

サーバ上で動いているphpのプロセスが一つしかなくて、メモリの容量もデータベースの容量と同じくらいの場合は、わざわざキャッシュサーバを使わなくても、osが勝手にメモリ上にキャッシュしておいてくれるから、キャッシュサーバは必要ないのかなと思ったのですがどうでしょうか?

OSのキャッシュは全く目的が違います
それはphpから見てもDBから見ても都合良く保存しておいてくれるタイプのキャッシュではありません

そのサーバーで複数のphpプロセスが動作するようになっている場合は、一つのプロセスが使えるメモリの量が減って

確かに減りはしますが、プロセスが常にMAXのメモリ容量を確保し続ける訳じゃないので微々たるものです
全く気にする必要はありません

投稿2021/07/17 09:55

hentaiman

総合スコア6389

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takuyaKK

2021/07/17 10:34

「osのキャッシュは目的が違う」の意味は、osのキャッシュは、ディスクから一度データを読み込めば、メモリに空きがある限り、ディスク上のデータをそのままメモリ上に展開しておいてくれるだけだが、memchashedとかはkey-valueの形で言わばデータを加工して使いやすくしておいてくれるということでしょうか? 「プロセスが常にMAXのメモリ容量を確保し続ける訳じゃないので・・」の部分は例えば仮定として、①データベースの容量が5gbで、サーバ上のメモリには5gbの空きがあった場合、サーバ上のプロセスが一つの場合は、メモリ上の5gbの空きにデータベースのデータ5gbを全て乗せることができると思います。 一方②データベースにアクセスするプロセスが3つあった場合、一つのプロセスは平均して1.6gbのメモリを使うことしか出来なくなると思うのですが違うのでしょうか? プロセスの数が少なければ少ないほど、一つのプロセスが使えるメモリ量は増え、プロセスの数が増えると頻繁にページスワップが増えキャッシュ機能が低下すると認識しているのですが....
hentaiman

2021/07/17 10:45

違いますね コメントで書かれているあなたの想像を説明する文章が分かりにくいので、もしかしたら色々と説明が抜け落ちているだけでも正しい理解をしている可能性もありますけど、恐らく違います コメントで更に追加質問したい時は想像や予想だけではなく、あなたの文章が正しいと仮定出来る根拠を示しながらコメントをしてもらえますか?そうすればこちらもあなたがどの部分の認識を誤っているのかを察する事が出来るかもしれません
hentaiman

2021/07/17 10:49

> 「osのキャッシュは目的が違う」の意味は、 DBのキャッシュとOSのキャッシュは違うという意味 DBの話をしているかと思ったらOSキャッシュと言い出したので
takuyaKK

2021/07/17 11:20

うまく説明できず申し訳ありません????‍♂️ 自己解決欄に追記をしたのですが、こちらの説明があっているか確認をお願いしてもよろしいでしょうか?
hentaiman

2021/07/17 12:10

読みましたが、雑過ぎて合ってるとも間違ってるとも・・ 場合によっちゃ合ってるし場合によっちゃ間違ってると言えるし、 自分の想像しているDBなら合ってるし、それらと違えば間違ってるし、知らないDBの話なら合ってるかどうかも分からないし なぜ想像しているDBという書き方をしているかと言うと、そういった情報が何も書かれていないからです 前提とする情報が足りていません
takuyaKK

2021/07/17 12:16

説明不足でした。 mysqlを想定していただければと思います。
hentaiman

2021/07/17 12:46

まだまだ回答は無理です 前提情報が全て分かり、曖昧な使われ方をしている単語の意図が全て明瞭になれば続けてコメントしたいと思います 強いて答えるなら以下だけ > そのプロセスが終了した時点で、そのキャッシュもクリアされるので、 終了した時点でクリアされるかもしれないし終了した時点ではクリアされないかもしれない どちらにしろ再利用可能な状態にはなる 本当にそこでキャッシュと言う単語を使いたかったのかどうかも疑わしい文章に見えます メモリという単語が使われていたならまた別の回答になってます
takuyaKK

2021/07/17 12:53 編集

その部分は特に本に書いてあるわけではなく、自分の知識を書いたものです。正しくは、プロセスが終了した時点で、そのプロセスが使っていたメモリ領域を参照するプロセスはなくなり、ガベージコレクションの対象になるといったところでしょうか。 曖昧な使われ方をしている単語を指定して頂けますと幸いです????‍♂️
hentaiman

2021/07/17 12:55

都度都度追加質問する前にもう少し自分で調べてください 一言一言対話形式で解決したいなら有償サービス探してみる事をおすすめします
takuyaKK

2021/07/17 13:01

自分では回答するに十分に足りる情報を出していると考えているため、hentaimanさんがどこで詰まっていらっしゃるのかお聞きしたかったのです。知識不足でどこまで書けば必要十分なのか分からず申し訳ありません。ここまでお付き合い頂きありがとうございました。
hentaiman

2021/07/17 16:26

いやいや、詰まってる理由のひとつとしては、あなたが以下のコメントをスルーしている事です > コメントで更に追加質問したい時は想像や予想だけではなく、あなたの文章が正しいと仮定出来る根拠を示しながらコメントをしてもらえますか?そうすればこちらもあなたがどの部分の認識を誤っているのかを察する事が出来るかもしれません わざとスルーしているのかと思ってました こちらの指摘コメントはスルーされてるのに自分の考えがあってるかどうかだけは見て見てーと言われてるので怠かったですが、もしわざとスルーした訳でないのなら質問と自己回答ともに編集して情報を付け足してみてはどうですか? 一部の表現についてはあなたの回答のコメント中の「本の内容から僕が推測した答えであって」という一文を見て初めて根拠皆無という事が分かりましたが・・・
takuyaKK

2021/07/18 01:30

あーそういう意味だったのですね!理解しました! ですが今回は他の方とのやりとりで大分疑問が解消したので、もう大丈夫です????‍♂️ 以後気をつけるように注意します????‍♂️ありがとうございました。
guest

0

自己解決

この記事によると、ただosの既存の機能でメモリにキャッシュするのと、インメモリデータベースでは、性能にかなりの違いがあるそうですキャッシュの大きいRDB vs インメモリデータベース、性能がどれだけ違うのか調べてみると

追記
結論
おそらく、プロセスが一つだろうと複数だろうとメモリ上にキャッシュされるディスクの量は変わらないものと思われます。
理由
「大規模サービス技術入門」という本に、データベースサーバを立ち上げて、しばらくするとメモリ上にデータベースのデータがキャッシュされて、システムが高速化されると書かれています。
じゃあメモリ上のどこにディスクデータが保存されるかというと、おそらくこのディスクキャッシュ上に保存されるのだと思います。ディスクキャッシュ
自分は各プロセスが持つメモリ上の領域に、毎回ディスクデータを読み込んでくるのかと当初は思っていて、今回の質問をしたのですが、良く考えると各プロセスが独自にディスクのデータをキャッシュしていたら、そのプロセスが終了した時点で、そのキャッシュもクリアされるので、永遠にキャッシュが最適化されることは起こり得ないですね。

追記
file base cache で検索
https://stackoverflow.com/questions/3148076/which-is-faster-better-for-caching-file-system-or-memcached

投稿2021/07/17 09:20

編集2021/09/10 07:16
takuyaKK

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/07/17 09:22

memcachedはインメモリのRDBMSではありません。
maisumakun

2021/07/17 12:02

> メモリ上のどこにディスクデータが保存されるかというと、おそらくこのディスクキャッシュ上に保存されるのだと思います。 OSがディスクのデータに対して持つメモリキャッシュと、RDBMSが持つキャッシュは、また別個のものです。
takuyaKK

2021/07/17 12:20

「大規模サービス技術入門」ではosが持つキャッシュについての話をしているものと思われます。 その前提のもとで、僕の説明におかしな点はありますでしょうか?
maisumakun

2021/07/17 12:23

> 大規模サービス技術入門」ではosが持つキャッシュについての話をしているものと思われます。 どうしてそう判断しましたか?
takuyaKK

2021/07/17 12:47

章のタイトルが「OSのキャッシュと分散」ですし、「OSがメモリの空いているところにどんどんディスクをキャッシュしていく」というようにOSが主語の記述は随所にあるものの、「RDBMSがキャッシュする」のような記述は一つも見当たらないからです。
maisumakun

2021/07/17 13:34

書いてもらえないとそれはわからないです。
takuyaKK

2021/07/17 13:52

「メモリ上のどこにディスクデータが保存されるかというと、おそらくこのディスクキャッシュ上に保存される」はあくまで、本の内容から僕が推測した答えであって、本の中には明示されていないんですよね。ごめんなさい。 とはいえ、本の中でデータベースからデータを読み込んだ後に、「sar -r コマンド」を実行すると「kbcached」の値が一気に増えることが紹介されているので、データベースのデータがメモリ上にキャッシュとして保存されるのは間違いないと思われるのですが、、、 https://qiita.com/kunihirotanaka/items/70d43d48757aea79de2d
maisumakun

2021/07/18 00:00

> 「RDBMSがキャッシュする」のような記述は一つも見当たらないからです。 記述はないですが、RDBMS自体もキャッシュを行います。現実のメモリ消費や動作速度を考える上で、OSのディスクキャッシュ「だけ」考えても意味はありません。
takuyaKK

2021/07/18 01:33

確かにbuffer-poolやクエリキャッシュなどが存在しますね。 ですがそれがosのディスクキャッシュとどのように相互作用し、どのように違うのか明確に書かれているものは、ちょっと見つけられなかったので、実装を読むしかなさそうですね。。。。https://www.postgresql.jp/document/9.1/html/runtime-config-resource.html ありがとうございます。
guest

0

キャッシュサーバは、データベースへの問い合わせ結果をキャッシュとしてメモリ上に保存しておきたい時に使いますよね?

それだけとは限りません。セッションデータのような、データベースに永続させる必要がない種類のデータを置くのにも使います。

投稿2021/07/17 09:15

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takuyaKK

2021/07/17 09:18

そのことはもちろん知っています。 今回の質問はデータベースのキャッシュとして使う場面でのメリットについての質問です。
maisumakun

2021/07/17 09:24

> そのことはもちろん知っています。 知っていたことを質問から読み取れなかったので、コメントせざるを得ませんでした。
takuyaKK

2021/07/17 09:27

説明不足ですいません。
maisumakun

2021/07/17 09:27

むしろ、実アプリケーションでRDBから引いた「そのまま」のデータを、積極的にmemcachedへキャッシュさせることがまれです。 memcachedで構築するキャッシュに置くようなデータは、ORMへの変換、集計処理、さらには出力に適した形への整形など、プログラムサイドで何かしらの加工を行うことが多いです。
takuyaKK

2021/07/17 10:57

また最初の質問に戻るのですが、一つのプロセスしか存在しない場合と、複数のプロセスが存在する場合でメモリ上におけるキャッシュはどのように違うのでしょうか?例えばこれによると、複数のスレッドが同じテーブルにアクセスした場合、スレッドごとに別々にデータを読み込むといったことが書かれており、こっちの方がメモリの使用量は増えるが、パフォーマンスが向上すると書かれています。何故なのかお分かりになりますでしょうか? http://download.nust.na/pub6/mysql/doc/refman/5.1-olh/ja/table-cache.html
takuyaKK

2021/07/17 11:21

色々と分かりにくい説明をしてしまい申し訳ありませんでした????‍♂️ 自己解決欄に追記をしたのですが、こちらの説明があっているか確認をお願いしてもよろしいでしょうか?
maisumakun

2021/07/17 12:00

> メモリ上におけるキャッシュはどのように違うのでしょうか? 「どの主体(OS、memcached、DBサーバなど)」が「何」について行うメモリキャッシュの話でしょうか?
takuyaKK

2021/07/17 12:17

すいません、この質問は今思うと的外れなものだったので無視していただけますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問