রেডিস সমস্ত স্মৃতি এবং ক্র্যাশগুলি গ্রহণ করে


12

একটি রিডিস সার্ভার v2.8.4 একটি উবুন্টু 14.04 ভিপিএসে 8 জিবি র‌্যাম এবং 16 জিবি সোয়াপ স্পেসের (এসএসডিগুলিতে) চলছে। তবে htopদেখায় যে redisএকা 22.4 Gস্মৃতি গ্রহণ করছে !

redis-serverশেষ পর্যন্ত মেমোরির কারণে ক্র্যাশ হয়ে গেছে। Memএবং Swpউভয়ই হিট 100% এর পরে redis-serverঅন্যান্য পরিষেবাদির সাথে নিহত হয়।

থেকে dmesg:

[165578.047682] Out of memory: Kill process 10155 (redis-server) score 834 or sacrifice child
[165578.047896] Killed process 10155 (redis-server) total-vm:31038376kB, anon-rss:5636092kB, file-rss:0kB

redis-serverএটির থেকে একটি OOM ক্র্যাশ থেকে পুনরায় চালু করা বা service redis-server force-reloadমেমরির ব্যবহার <100MB এ নেমে আসে।

প্রশ্ন:redis-server ক্রাশ না হওয়া অবধি কেন আরও বেশি স্মৃতি দখল করে ? আমরা কীভাবে এটি প্রতিরোধ করতে পারি?

এটি কি সত্য যে সেটিংটি maxmemoryকাজ করবে না কারণ একবারে রেডিস maxmemoryসীমাবদ্ধ হয়ে গেলে , এটি ডেটা অপসারণ শুরু করবে?

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

Redis- সার্ভার পুনরায় আরম্ভ করার পরে

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

পুনরায় সংস্করণ: Redis server v=2.8.4 sha=00000000:0 malloc=jemalloc-3.4.1 bits=64 build=a44a05d76f06a5d9


হালনাগাদ

৪.৪ জি ​​র‌্যাম এবং ২২.G জি অদলবদলের htopমেমোরির ব্যবহারের প্রতিবেদন করা হলে , আরডিবিটোলেস দ্বারা প্রতিবেদন হিসাবে, redis-serverরেডিসের সমস্ত কী দ্বারা নেওয়া স্থানের পরিমাণটি কেবলমাত্র । এটি পুনরায় চালু হওয়ার পরে ডানদিকে নেওয়া র্যামের পরিমাণও ।60.59636307 MBredis-server

INFO ALLযখন redis-serverটন মেমরি গ্রহণ করা হয়

mem_fragmentation_ratio:0.19

127.0.0.1:6379> INFO all

# Server
redis_version:2.8.4
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:a44a05d76f06a5d9
redis_mode:standalone
os:Linux 3.13.0-24-generic x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.2
process_id:26858
run_id:4d4a507b325e567d5ada203a0c65891bcf4d02de
tcp_port:6379
uptime_in_seconds:100011
uptime_in_days:1
hz:10
lru_clock:165668
config_file:/etc/redis/redis.conf

# Clients
connected_clients:60
client_longest_output_list:768774
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:23973468008
used_memory_human:22.33G
used_memory_rss:4563857408
used_memory_peak:24083474760
used_memory_peak_human:22.43G
used_memory_lua:33792
mem_fragmentation_ratio:0.19
mem_allocator:jemalloc-3.4.1

# Persistence
loading:0
rdb_changes_since_last_save:127835154
rdb_bgsave_in_progress:0
rdb_last_save_time:1406716479
rdb_last_bgsave_status:err
rdb_last_bgsave_time_sec:1
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok

# Stats
total_connections_received:110
total_commands_processed:386765263
instantaneous_ops_per_sec:3002
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:1385878
keyspace_misses:23655
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:82

# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:10547.48
used_cpu_user:8240.36
used_cpu_sys_children:201.83
used_cpu_user_children:914.86

# Commandstats
cmdstat_del:calls=136,usec=1407,usec_per_call=10.35
cmdstat_exists:calls=161428,usec=1391252,usec_per_call=8.62
cmdstat_zadd:calls=64149642,usec=936323882,usec_per_call=14.60
cmdstat_zrem:calls=137,usec=2131,usec_per_call=15.55
cmdstat_zremrangebyscore:calls=2293,usec=111905082,usec_per_call=48802.91
cmdstat_zrange:calls=7925,usec=285907448,usec_per_call=36076.65
cmdstat_zrangebyscore:calls=921434,usec=292731002,usec_per_call=317.69
cmdstat_zcount:calls=8,usec=172,usec_per_call=21.50
cmdstat_zrevrange:calls=191184,usec=965447,usec_per_call=5.05
cmdstat_zcard:calls=5180,usec=13502,usec_per_call=2.61
cmdstat_zscore:calls=29856,usec=576044,usec_per_call=19.29
cmdstat_hset:calls=64145124,usec=199407095,usec_per_call=3.11
cmdstat_hget:calls=248487,usec=501220,usec_per_call=2.02
cmdstat_hincrby:calls=128339355,usec=2071112929,usec_per_call=16.14
cmdstat_hgetall:calls=193747,usec=1608260,usec_per_call=8.30
cmdstat_select:calls=1,usec=5,usec_per_call=5.00
cmdstat_rename:calls=134,usec=1090,usec_per_call=8.13
cmdstat_keys:calls=4503,usec=4997628,usec_per_call=1109.84
cmdstat_bgsave:calls=2,usec=20012,usec_per_call=10006.00
cmdstat_type:calls=603,usec=2736,usec_per_call=4.54
cmdstat_multi:calls=64181979,usec=383633610,usec_per_call=5.98
cmdstat_exec:calls=64181979,usec=4403181204,usec_per_call=68.60
cmdstat_info:calls=126,usec=28675,usec_per_call=227.58

# Keyspace
db0:keys=2109,expires=0,avg_ttl=0

উত্তর:


8
  1. maxmemoryআপনার রেডিস ডাটাবেসটি কতটা বাড়তে পারে তার সীমা নির্ধারণ করতে ব্যবহার করুন । এটি করতে ব্যর্থ হওয়া, মেমরি শেষ হয়ে যাওয়ার পরে ওএস এটি হত্যা না করা পর্যন্ত Redis বৃদ্ধি পাবে (আপনার বর্তমান অভিজ্ঞতা অনুযায়ী)।
  2. এর ব্যবহারের maxmemoryসাথে মিলিত হওয়া উচিত maxmemory-policy- আপনি আপনার ব্যবহারের ক্ষেত্রে প্রয়োজনীয়তার উপর নির্ভর করে বিভিন্ন উচ্ছেদ নীতিগুলি থেকে চয়ন করতে পারেন। উদাহরণস্বরূপ, আপনি যদি allkeys-lruউচ্ছেদের নীতিটি ব্যবহার করেন তবে রেডিস একবারে maxmemoryপৌঁছে যাওয়ার পরে ডেটাটি (খালি সম্প্রতি ব্যবহৃত) ডেটা উচ্ছেদ শুরু করবে । বিকল্পভাবে, আপনি রেডিসকে কেবলমাত্র নীতিগুলি volatile-lruবা volatile-randomনীতিগুলি দিয়ে মেয়াদোত্তীকরণের যোগ্য ডেটা উচ্ছেদ করার নির্দেশ দিতে পারেন । শেষ অবধি, আপনি এই নীতিটি সেট করতে পারেন noevictionতবে তার অর্থ এই হবে যে একবার মেমরি শেষ হয়ে গেলে রেডিস আরও একটি OOM বার্তা দিয়ে আরও লেখার বিষয়টি অস্বীকার করবে।

সম্পাদনা:

প্রথমে অদলবদল অক্ষম করুন - রেডিস এবং অদলবদে সহজেই মিশ্রিত হয় না এবং এটি অবশ্যই স্বচ্ছলতা সৃষ্টি করতে পারে।

এছাড়াও কি free -mআপনার RAM এর রাজ্য (পূর্ণ ছবি শীর্ষ পরিবর্তে http://www.linuxatemyram.com/ )।


আপনাকে ধন্যবাদ, আমি কেন মেমোরির ব্যবহার বাড়িয়ে রাখছি তা নিয়ে বিভ্রান্ত হয়েছি, তবুও এটি করা bgsaveএবং পুনরায় চালু করার redis-serverফলে মেমরির ব্যবহারটি আরও বেশি যুক্তিসঙ্গত মানের 70০ এমবিতে নেমে আসে। এটি কি কোনও স্মৃতি ফাঁস হতে পারে?
Nyxynyx

সম্ভাব্য তবে অসম্ভব (বা অন্যান্য লোকেরা এটি জানিয়েছে) ... সম্ভবত খণ্ডিত সমস্যা issue এর পরের বার, আপনার রেডিসের আউটপুট পোস্ট করুন INFO ALL। যদি আমার অনুমান সঠিক mem_fragmentation_ratioহয় তবে উইলটি আকাশে উচ্চতর।
ইতামার হাবের

redis-serverসমস্ত স্মৃতি হোগ করে এবং প্রতিদিন ক্রাশ হয়। এটি এখন সমস্ত স্মৃতি ব্যবহার করতে চলেছে, তাই আমি আউটপুট ক্যাপচার করেছি INFO ALLএবং ওপিতে যোগ করেছি । mem_fragmentation_ratio:0.19
Nyxynyx

যদি রেডিস ডেটাসেটগুলি 250 এমবি অতিক্রম না করে এবং maxmemory1 জিবিতে সেট করা থাকে, এর অর্থ কি যখন রেডিসের মেম ব্যবহার 1 জিবি হিট করে, তখনও উচ্ছেদের তথ্য মুছে ফেলা হবে? যেহেতু রেডিস mem_fragmentation_ratioহ'ল 0.19, এর অর্থ কি এই যে খুব বেশি টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো আছে, বা খুব বেশি পরিমাণে অদলবদরে বা উভয়ই সঞ্চিত আছে? খণ্ড খণ্ডনের কোনও উপায়?
Nyxynyx

ওডমের কারণে যখন রেডিস-সার্ভার ক্রাশ হতে চলেছে, rdbtools দেখায় যে redis- এ থাকা কীগুলি কেবল 60MB নেয়। এটি দেখতে ভীষণ মারাত্মক খণ্ডন বলে মনে হচ্ছে? এর 4.4 গিগাবাইট র‌্যাম এবং 22.4G অদলবলে নেওয়া বিবেচনা করে।
Nyxynyx

5

এটি প্রায় নিশ্চিতভাবেই মেমরি খণ্ডিত, কারণ রেডিস প্রযোজনায় সুপরিচিত এবং পছন্দসই এবং সম্ভবত আপনি কোনও মেমরি ফাঁস পান নি।

পুলের আকার নির্ধারণের বিষয়ে প্রস্তাবনাগুলি খণ্ডন করতে সহায়তা করবে না। আপনাকে রেডিসের আকারটি হ্রাস করতে হবে - আপনার আসল মেমরির আকারের চেয়ে কম - কারণ রেডিস খণ্ডন করতে পারে না - তবে একটি সংক্ষিপ্ত উত্তরের ক্ষেত্রে আপনাকে এটি করতে হবে এবং আপনার পুনরায় চালু করার পরিকল্পনা শুরু করতে হবে সার্ভার ঘন ঘন।

বিভিন্ন অপারেটিং সিস্টেম এবং ইন-মেমরি ডেটাবেসগুলির সাথে আমার থাম্বের কাজ করার নিয়মটি হ'ল আপনার আসল স্মৃতি 2x প্রয়োজন এবং মেমরির আকার প্রায় 2 সপ্তাহের মধ্যে স্থিতিশীল হয়ে উঠবে।

তবে এটি আপনার আসল বরাদ্দের ধরণ এবং আপনি যে মেমরির বরাদ্দ ব্যবহার করছেন তার উপর নির্ভর করে।

এই মুহুর্তে, সার্ভারগুলির জন্য আমি খুঁজে পেয়েছি সেরা মেমোরি বরাদ্দকারী হলেন জেমালোক। দীর্ঘমেয়াদী মেমরি বিভাজন কমাতে (প্রায় অপসারণ) করতে আমরা এখন এটি এয়ারস্পাইকে ব্যবহার করি । জেমালোকের একটি বৈশিষ্ট্য রয়েছে যা আপনাকে একটি মেমরি "আখড়া" (পুল) তৈরি করতে দেয় এবং যে কোনও বরাদ্দের ক্ষেত্রে কোন পুলটি বেছে নিতে পারে, এইভাবে আপনাকে আকারের বরাদ্দ দেয় এবং অনুরূপ মেমরির আজীবন বরাদ্দ পরিচালনা করতে পারে। আপনি যে ধরণের ক্ষেত্রে আলোচনা করছেন তা আমাদের পক্ষে বড় জয়।

জেন্ড পিএইচপি ইঞ্জিনটি এক্ষেত্রে পরিশীলিত, কারণ ইঞ্জিনের অভ্যন্তরে সমস্ত বরাদ্দ হয় প্রতি লেনদেন মেমরি বা গ্লোবাল মেমরির মধ্যে। লেনদেন শেষে প্রতি লেনদেনের মেমরি ওয়ান-ফ্যাল-স্যুপে মুক্ত হয় এবং এটি খুব কার্যকর হতে পারে।

আপনি যদি লিনাক্সে থাকেন তবে কার্নেল মেমরি বরাদ্দকারী (ক্লিবি) বেশ কয়েকটি বাঁক এবং টার্ন নিয়েছে এবং আপনি কোন সংস্করণে নাটকীয়ভাবে খণ্ডের পরিমাণ নির্ধারণ করবেন, প্রকৃত প্রয়োগের ধরণ হিসাবে will উদাহরণস্বরূপ, কিছু বরাদ্দকারীরা যখন আপনি সামান্য বর্ধনযোগ্য বস্তুগুলি করেন তখন কিছুটা আরও ভাল হয়, কিছু কিছু আরও খারাপ হয়। আফসোস, এমনকি অন্যান্য রেডিস ব্যবহারকারীদের সাথে আলোচনা করার অর্থ আপনি কোন ওএস এবং কোন ওএস সংস্করণটি ব্যবহার করছেন সে সম্পর্কে কথা বলা।

আপনি সার্ভারটি পুনরায় চালু করতে (অধ্যবসায় থেকে) এবং আপনার স্মৃতি ফিরে পেতে পারার অর্থ একটি ফাঁস হতে পারে তবে খণ্ডিত হওয়ার সম্ভাবনা বেশি রয়েছে।

  1. অদলবদল বাতিল করবেন না (রেডিসের জন্য এটি ওওএমের থেকে অদলবদলের চেয়ে ভাল)
  2. Redis এর মেমরির আকার হ্রাস করুন
  3. একটি সময়সূচী পুনরায় আরম্ভ করুন

সামঞ্জস্য করে আপনি কীভাবে মেমরির আকার হ্রাস করবেন maxmemory?
Nyxynyx
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.