Linux下Redis内存优化

Jun 07, 2016 pm 04:37 PM
http linux redis 最適化 メモリ

原文:http://mengzhuo.org/blog/linux%E4%B8%8Bredis%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96.html 最近使用Redis,由于它属于内存数据库,所以调优都集中到了内存上。 根据Redis官方说法: 需要将 vm.overcommit 设置为1 sysctl vm.overcommit_memory=1 确保

原文:http://mengzhuo.org/blog/linux%E4%B8%8Bredis%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96.html

最近使用Redis,由于它属于内存数据库,所以调优都集中到了内存上。

根据Redis官方说法:

  • 需要将vm.overcommit设置为1
    sysctl vm.overcommit_memory=1
    ログイン後にコピー
  • 确保设置了一定量的swap,最好和内存一样大,否则内核的OOM(out-of-memory)killer会干掉Redis进程
  • 若Redis是大量写入的应用,持久化的RDB或者AOF会按比例使用,或很有可能使用redis使用量的一样多的内存.


使用和Redis一样多的内存做持久化,那我岂不是都得让一半的内存出来给它?
还有那个overcommit是几个意思也不解释一样?搞砸了其他进程肿么办?

好吧,得研究一下内存是如何管理的:
内核会将物理内存分割成动态虚拟的内存页(page),然后在malloc时按overcommit_memory和overcommit_ratio的设置来确定是否允许分配虚拟内存页。
翻看Linux Kernel的文档/资料才发现,有三种值:

  • overcommit_memory=0,默认,智能超发,每次要求分配内存时,kernel都会比较请求的空间和空余的空间是否足以分配
  • overcommit_memory=1,请求分配内存时,永远假装还有足够的内存
  • overcommit_memory=2,不允许超发内存,即允许分配的大小小于
    overcommit_ratio*物理内存+swap大小
    ログイン後にコピー

好吧,Redis要大家假装还有空余内存…也就是说会有很大的几率触发Swap造成性能急剧下降,不过,性能下降总比不能用好

说到swap,大家肯定给Redis服务器设定过swappiness=0,然后祈祷奇迹的发生,但是还是触发了swap。
为什么呢?

首先,Linux十分注重读写性能,尽量避免磁盘IO,你从磁盘上读取的文件会被放入内存,就算程序结束了,还是存在的,这部分内存被称为file buffer(或者file page),是swap重点照顾的回收对象。
其次,Linux上的用户态进程所有页(也就是redis运行时占用的)也是可以回收的。

其实,swap的触发机制是这样的:

根据swap倾向(swap_tendency)决定回收用户态页还是file buffer,最后把LRU队列中用得最少的放入swap空间中。

摘自LWN
以下是内核计算其 “swap倾向”的公式:

swap_tendency = mapped_ratio/2 + distress + vm_swappiness
ログイン後にコピー

其中:

  • distress 值是内核在释放内存时遇到的问题数。当内核第一次决定收回内存页面时, distress将为0;尝试次数越多,这个值也越大。
  • mapped_ratio值是mapped page与总page比例,即
    mapped ratio = (nr mapped * 100) / total memory
    ログイン後にコピー

    nr_mapped可以从下面的命令行获得

    grep nr_mapped /proc/vmstat
    ログイン後にコピー
  • vm_swappiness 就是大家设定的swappniness值

当swap_tendency超过100时,swap就开始收集最近较少用的页。
而且swappiness设置为0,PRFA就不会回收用户态页,
设置为100时,总是回收用户态页,当然这不是我们想看到的。

最后回到之前的问题,怎么避免触发swap?
其实调整好swapiness之后,只需要监测/proc/zoneinfo中的pages free/high 之间的差值即可,high是当前zone中计算出来的高水位值,当pages free低于pages high才会触发swap回收页,就是这么简单啦~

实在担心的话可以用

redis-server --test-memory 需要测试的内存(MB)
ログイン後にコピー

测试一下,系统就会在给定的内存下跑测试。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Linuxアーキテクチャ:5つの基本コンポーネントを発表します Linuxアーキテクチャ:5つの基本コンポーネントを発表します Apr 20, 2025 am 12:04 AM

Linuxシステムの5つの基本コンポーネントは次のとおりです。1。Kernel、2。Systemライブラリ、3。Systemユーティリティ、4。グラフィカルユーザーインターフェイス、5。アプリケーション。カーネルはハードウェアリソースを管理し、システムライブラリは事前コンパイルされた機能を提供し、システムユーティリティはシステム管理に使用され、GUIは視覚的な相互作用を提供し、アプリケーションはこれらのコンポーネントを使用して機能を実装します。

GITの倉庫アドレスを確認する方法 GITの倉庫アドレスを確認する方法 Apr 17, 2025 pm 01:54 PM

gitリポジトリアドレスを表示するには、次の手順を実行します。1。コマンドラインを開き、リポジトリディレクトリに移動します。 2。「git remote -v」コマンドを実行します。 3.出力と対応するアドレスでリポジトリ名を表示します。

Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Apr 19, 2025 pm 11:36 PM

Redisキャッシュソリューションは、製品ランキングリストの要件をどのように実現しますか?開発プロセス中に、多くの場合、ランキングの要件に対処する必要があります。

Laravelインストールコード Laravelインストールコード Apr 18, 2025 pm 12:30 PM

Laravelをインストールするには、これらの手順を順番に進みます。コンポーザー(MacOS/LinuxとWindows用)インストールLaravelインストーラーをインストールします。

Redisの役割:データストレージと管理機能の調査 Redisの役割:データストレージと管理機能の調査 Apr 22, 2025 am 12:10 AM

Redisは、データストレージと管理において重要な役割を果たしており、複数のデータ構造と持続性メカニズムを通じて最新のアプリケーションの中核となっています。 1)Redisは、文字列、リスト、コレクション、注文されたコレクション、ハッシュテーブルなどのデータ構造をサポートし、キャッシュや複雑なビジネスロジックに適しています。 2)RDBとAOFの2つの持続方法を通じて、Redisは信頼できるストレージとデータの迅速な回復を保証します。

RedisキャッシュがSpring Bootで失敗した場合はどうすればよいですか? RedisキャッシュがSpring Bootで失敗した場合はどうすればよいですか? Apr 19, 2025 pm 08:03 PM

スプリングブートでは、Redisを使用してOAuth2Authorizationオブジェクトをキャッシュします。 Springbootアプリケーションでは、Springsecurityouth2authorizationserverを使用してください...

重要なgit構成グローバルプロパティを設定する方法 重要なgit構成グローバルプロパティを設定する方法 Apr 17, 2025 pm 12:21 PM

開発環境をカスタマイズするには多くの方法がありますが、グローバルGit構成ファイルは、ユーザー名、電子メール、優先テキストエディター、リモートブランチなどのカスタム設定に使用される可能性が最も高いものです。グローバルGIT構成ファイルについて知っておくべき重要なことは次のとおりです。

LinuxのDocker:Linuxシステムのコンテナ化 LinuxのDocker:Linuxシステムのコンテナ化 Apr 22, 2025 am 12:03 AM

Linuxは、豊富なツールとコミュニティサポートを提供するネイティブプラットフォームであるため、LinuxでDockerが重要です。 1. docker:sudoapt-getupdateとsudoapt-getinstalldocker-cedocker-ce-clicotainerd.ioを使用します。 2。コンテナの作成と管理:Dockerrun-D-Namemynginx-P80:80NginxなどのDockerrunコマンドを使用します。 3。DockerFileを書き込み:画像サイズを最適化し、マルチステージ構造を使用します。 4。最適化とデバッグ:DockerLogsとDockerexを使用します

See all articles