পোস্টগ্রাইএসকিউএল-এ পুলের আকার এবং ডাটাবেস সংযোগের মধ্যে মিষ্টি স্পটটি কীভাবে নির্ধারণ করা যায়


14

আমাদের ডেটাবেস সার্ভারে শিখর সময় ট্র্যাফিক পরিচালনা করতে আমাদের সমস্যা হচ্ছে। আমরা হার্ডওয়্যারটি উন্নত করতে চাইছি (বিষয়গুলির সেই দিকটি সম্পর্কে এই প্রশ্নটি দেখুন ) তবে আমরা পুলিং কনফিগারেশন এবং সার্ভার টিউনিংয়ের ক্ষেত্রেও কাজ করতে চাই।

আবেদন আমরা কাজ করছি যেখানে ব্যাকএন্ড নিয়ে গঠিত স্মার্টফোনের জন্য একটি পালা-ভিত্তিক মাল্টিপ্লেয়ার খেলা পাগল সঙ্গে Unicorn এবং পোস্টগ্রি 9.1 ডাটাবেসের হিসাবে। বর্তমানে আমাদের কাছে 600,000 নিবন্ধিত ব্যবহারকারী রয়েছে এবং যেহেতু গেমের স্টেটাসটি ডাটাবেসে সঞ্চিত থাকে প্রতি সেকেন্ডে কয়েক হাজার রাইট তৈরি হয়। আমরা পোস্টগ্রেএসকিউএল থেকে লগ ফাইলগুলি PgBadger ব্যবহার করে বিশ্লেষণ করেছি এবং জটিল সময়ে আমরা প্রচুর পাই

FATAL: remaining connection slots are reserved for non-replication superuser connections

কাউন্টারে সাদাসিধা সমাধান এই সমস্যা হবে বৃদ্ধি max_connections (বর্তমানে 100 যা) এ postgresql.conf । আমি http://wiki.postgresql.org/wiki/Number_Of_Database_Connifications পড়েছি যা ইঙ্গিত দেয় যে এটি করা সঠিক জিনিস নাও হতে পারে। পূর্বোক্ত নিবন্ধে এটি সর্বাধিক_সংযোগ এবং পুলের আকারের মধ্যে মিষ্টি স্পট সন্ধান করার জন্য উল্লেখ করা হয়েছে ।

এই মিষ্টি স্পটটি সন্ধান করার জন্য কী করা যেতে পারে? সর্বোচ্চ_ সংযোগগুলি এবং পুলের আকারের বিভিন্ন মানগুলির জন্য I / O কার্যকারিতা পরিমাপ করার জন্য কি কোনও ভাল সরঞ্জাম আছে ?

আমাদের বর্তমান সেটআপটি 4 টি গেম সার্ভার, প্রত্যেকটিতে 16 টি ইউনিকর্ন কর্মী এবং 5 টির আকারের পুল রয়েছে।

এখানে আমরা ব্যবহার করছি এমন নন-ডিফল্ট পোস্টগ্র্যাস-সেটিংস:

version                      | PostgreSQL 9.1.5 on x86_64-unknown-linux-gnu,compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
checkpoint_completion_target | 0.9
checkpoint_segments          | 60
checkpoint_timeout           | 6min
client_encoding              | UTF8
effective_cache_size         | 2GB
lc_collate                   | en_US.UTF-8
lc_ctype                     | en_US.UTF-8
log_destination              | csvlog
log_directory                | pg_log
log_filename                 | postgresql-%Y-%m-%d_%H%M%S.log
log_line_prefix              | %t
log_min_duration_statement   | 200ms
log_rotation_age             | 1d
log_rotation_size            | 10MB
logging_collector            | on
max_connections              | 100
max_stack_depth              | 2MB
server_encoding              | UTF8
shared_buffers               | 1GB
ssl                          | on
TimeZone                     | localtime
wal_buffers                  | 16MB
work_mem                     | 8MB

আপনি কি সেই ব্যক্তি যে গত কয়েক সপ্তাহের মধ্যে মেলিং তালিকায় এ সম্পর্কে জিজ্ঞাসা করেছিলেন? যদি তা হয় তবে আমি সেই আলোচনায় ব্যাক-লিঙ্কগুলি যুক্ত করব। এছাড়াও: আপনার ডিবি সার্ভার হার্ডওয়্যার এবং কনফিগারেশন কী? wiki.postgresql.org/wiki/Slow_Query_Questions । অ-ডিফল্ট সেটিংস অন্তর্ভুক্ত করুন: wiki.postgresql.org/wiki/Server_Configration । আপনি কি wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server পড়েছেন ? আপনি কি ব্যাচকে আরও বড় লেনদেনের ক্ষেত্রে কাজ করতে পারেন? আপনি কি ক্যাচিং স্তর ব্যবহার করেন এবং যদি তাই হয় তবে কী? আপনি ব্যবহার করছেন synchronous_commit = offবা একটি commit_delay?
ক্রেগ রিঞ্জার 10

সুতরাং আপনার পোস্টগ্র্রেএসকিউএল সার্ভারের সাথে মোট 20 টি সংযোগ রয়েছে? গেম সার্ভার প্রতি 5? প্রতিটি গেম সার্ভার থেকে এই 5 টি সংঘটি 16 টি ইউনিকর্নের কর্মী জুড়ে রয়েছে?
ক্রেগ রিঞ্জার 10

ওহ, আপনি ধীর অনুসন্ধানগুলি লগইন করছেন? যদি তা হয় তবে আপনার হট স্পটগুলি কী কী? সিম্পল INSERTএস? আপনার স্কিমা কেমন - এটি ভাগ করা হয়েছে? কি explain analyzeকিছু নমুনা জিজ্ঞাসা? আপনার চেকপয়েন্টগুলি কত ঘন ঘন এবং তারা কতক্ষণ সময় নেয়? (চেকপয়েন্ট লগিং বিকল্পগুলি দেখুন)। এবং গুরুত্ব সহকারে, আপনার পোস্টগ্রিজ এসকিউএল সংস্করণটি কী? (আপডেট: আপনি নিজের হার্ডওয়্যারটি এখানে তালিকাবদ্ধ করেছেন বলে মনে হচ্ছে: dba.stackexchange.com/questions/28061/… )
ক্রেগ

যাইহোক, পুল আকারের টিউনিংয়ের জন্য, কেবলমাত্র আসল উত্তরগুলি হ'ল লোড এবং ডিবি সার্ভার থ্রুপুটটির দৃust় পরিমাপ সেট আপ করা হয়, তারপরে আপনি মিষ্টি স্পট না পাওয়া পর্যন্ত উপরে এবং নীচে সামঞ্জস্য করা শুরু করুন।
ক্রেগ রিঞ্জার

পছন্দ করুন তবে ব্যাকলিঙ্কগুলির জন্য ধন্যবাদ! আমি আপনার পোস্টগ্রিগ এসকিউএল সার্ভারটি টিউন করে পড়েছি এবং উল্লিখিত কয়েকটি টিপস অনুসরণ করেছি। আমি এখন নন-ডিফল্ট সেটিংস অন্তর্ভুক্ত করেছি। আমরা এখন বৃহত্তর লেনদেন এবং পরীক্ষার বিষয়ে সন্ধান করছিsynchronous_commit = off
লোরগার্টজোর

উত্তর:


14

এখানে সংক্ষিপ্ত উত্তর হ'ল "নজরদারি এবং পারফরম্যান্স মেট্রিক্স দ্বারা পরিচালিত ট্রায়াল এবং ত্রুটি"।

থাম্বের কয়েকটি সাধারণ নিয়ম রয়েছে যা আপনাকে যে অস্পষ্ট অঞ্চলটি শুরু করা উচিত তা খুঁজে পেতে সহায়তা করবে তবে সেগুলি খুব সাধারণ। বিস্তৃত নির্দেশিকাগুলি "সিপিইউ সংখ্যা এবং স্বতন্ত্রের সংখ্যা হ'ল ডিস্ক" প্রায়শই উদ্ধৃত হয় তবে এটি কেবল একটি অবিশ্বাস্যভাবে মোটা শুরুর পয়েন্ট।

আপনাকে যা করতে হবে তা হ'ল আপনার অ্যাপ্লিকেশনটির জন্য শক্তিশালী পারফরম্যান্স মেট্রিক্স। পরিসংখ্যান রেকর্ডিং শুরু করুন।

এর জন্য ইন্টিগ্রেটেড টুলিংয়ের পথে তেমন কিছুই নেই। নাগিওস check_postgresস্ক্রিপ্ট, ক্যাক্টি সিস্টেমের পারফরম্যান্স কাউন্টার লগিং, পোস্টগ্রিসএসকিউএল পরিসংখ্যান সংগ্রহকারী, ইত্যাদির মতো জিনিস রয়েছে ... তবে এর সব কিছুই একসাথে রাখার মতো খুব বেশি কিছু নেই। দুঃখের বিষয়, আপনাকে নিজেরাই এটি করতে হবে। পোস্টগ্রিসকিউএল পক্ষের জন্য, পোস্টগ্রেএসকিউএল ম্যানুয়ালটিতে পর্যবেক্ষণ দেখুন । কিছু তৃতীয় পক্ষের বিকল্প রয়েছে যেমন এন্টারপ্রাইজবিবি'র পোস্টগ্রিস এন্টারপ্রাইজ মনিটর

এখানে উল্লিখিত অ্যাপ্লিকেশন-স্তরের মেট্রিকগুলির জন্য আপনি এগুলি ভাগ করা ডেটা স্ট্রাকচারে বা রেডিসের মতো কোনও বহিরাগত অ-টেকসই ডিবিতে রেকর্ড করতে এবং আপনার পোস্টগ্রিজ এসকিউএল ডিবিতে লেখার আগে সেগুলি একত্রিত করতে চান। সরাসরি পিজিতে লগ ইন করার চেষ্টা করা হলে পরিমাপগুলি রেকর্ড করে তৈরি ওভারহেড দিয়ে আপনার পরিমাপকে বিকৃত করবে এবং সমস্যাটি আরও খারাপ করবে।

সহজ বিকল্পটি হ'ল প্রতিটি অ্যাপ্লিকেশন সার্ভারের একটি সিঙ্গলটন যা আপনি অ্যাপ্লিকেশন পরিসংখ্যান রেকর্ড করতে ব্যবহার করেন। আপনি সম্ভবত সর্বনিম্ন মিনিট, সর্বোচ্চ, এন, মোট এবং গড় আপডেট করতে চান; এইভাবে আপনাকে প্রতিটি স্ট্যাট পয়েন্ট সংরক্ষণ করতে হবে না, কেবল সমষ্টিগুলি। এই সিঙ্গেলটন প্রতিটি এক্স মিনিটে পিজিতে তার সামগ্রিক পরিসংখ্যান লিখতে পারে, একটি কম পরিমাণে হার যা পারফরম্যান্সের প্রভাবটি সর্বনিম্ন হবে।

শুরু করা:

  • অনুরোধের বিলম্ব কী? অন্য কথায়, অ্যাপ্লিকেশন ক্লায়েন্টের কাছে কোনও প্রতিক্রিয়া না পাওয়া পর্যন্ত ক্লায়েন্টের কাছ থেকে একটি অনুরোধ পেতে কতক্ষণ সময় নেয়। এটিকে পৃথক রেকর্ড হিসাবে না করে সময়ের মধ্যে সামগ্রিকভাবে রেকর্ড করুন। অনুরোধের প্রকার অনুসারে এটি গ্রুপ করুন; বলুন, পৃষ্ঠা দ্বারা।

  • প্রতিটি ক্যোয়ারী বা ক্যোয়ারির জন্য ডেটাবেস অ্যাক্সেস বিলম্ব কী অ্যাপটি চালায়? যতক্ষণ না ডিবি তথ্য / স্টোরিং তথ্য জিজ্ঞাসা করে এটি সম্পন্ন না করে এবং পরবর্তী কাজটি চালিয়ে যেতে পারে? আবার অ্যাপ্লিকেশনগুলিতে এই পরিসংখ্যানগুলিকে একত্র করুন এবং কেবলমাত্র ডিবিতে সমষ্টি তথ্য লিখুন।

  • আপনার থ্রুপুট কেমন? যে কোনও এক্স মিনিটে, আপনার অ্যাপ্লিকেশনটি কার্যকর প্রতিটি বড় শ্রেণীর কতগুলি ডিবি দ্বারা সার্ভিস হয়?

  • X মিনিটের একই সময়ের ব্যাপ্তির জন্য, কত ক্লায়েন্টের অনুরোধ ছিল?

  • প্রতি কয়েক সেকেন্ড স্যাম্পলিং এবং ডিবিতে একই x মিনিটের উইন্ডোগুলিতে একত্রিত হয়ে কত ডিবি সংযোগ ছিল? তাদের মধ্যে কতজন অলস ছিল? কতজন সক্রিয় ছিল? সন্নিবেশে? আপডেট চান? নির্বাচিত করেন কে? মুছে ফেলেছে? সেই সময়কালে সেখানে কতগুলি লেনদেন হয়েছিল? দেখুন পরিসংখ্যান সংগ্রাহক ডকুমেন্টেশন

  • আবার একই সময়ের ব্যবধানে নমুনা সংগ্রহ ও একত্রিত করা, হোস্ট সিস্টেমের পারফরম্যান্স মেট্রিকগুলি কী কী ছিল? কতজন পড়ে এবং কতজন ডিস্ক আইও / সেকেন্ড লেখেন? প্রতি সেকেন্ডে মেগাবাইট ডিস্ক পড়ে এবং লেখেন? সিপিইউ ব্যবহার? লোড গড়? র‌্যাম ব্যবহার?

আপনি এখন আপনার অ্যাপ্লিকেশনটির কার্যকারিতা সম্পর্কে তথ্য শিখতে শুরু করতে পারেন ডেটা সম্পর্কিত, এটি আঁকানো ইত্যাদি। আপনি নিদর্শনগুলি দেখতে শুরু করবেন, বাধা খুঁজে পেতে শুরু করবেন।

আপনি শিখতে পারেন যে আপনার সিস্টেমে বোতল-ঘাড় INSERTএবং UPDATEউচ্চ লেনদেনের হারে সেকেন্ডে মেগাবাইটে কম ডিস্ক আই / ও থাকা সত্ত্বেও। এটি একটি ইঙ্গিত হতে পারে যে আপনার ব্যাটারি ব্যাকড রাইট-ব্যাক ক্যাচিং RAID নিয়ামক বা কিছু উচ্চ-মানের পাওয়ার-সুরক্ষিত এসএসডি দিয়ে আপনার ডিস্ক ফ্লাশ পারফরম্যান্সটি উন্নত করতে হবে। synchronous_commit = offসার্ভার ক্র্যাশে কয়েকটি লেনদেন হারাতে ঠিক আছে এবং এবং / অথবা এ commit_delay, কিছু সিঙ্ক লোড নিতে বন্ধ করে দেওয়াও আপনি ঠিক ব্যবহার করতে পারেন ।

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

আপনার যদি দ্রুত ফ্লাশিং স্টোরেজ (BBU RAID বা দ্রুত টেকসই এসএসডি) না থাকে তবে আপনি সক্রিয়ভাবে সংযোগের সংখ্যার তুলনায় মোটামুটি সংখ্যক বেশি চাইবেন না, সম্ভবত আপনার যত ডিস্কের সংখ্যা রয়েছে 2x এ, সম্ভবত কম রেডের উপর নির্ভর করে কম , ডিস্ক কর্মক্ষমতা ইত্যাদি। এক্ষেত্রে এটি পরীক্ষার এবং ত্রুটির পক্ষেও মূল্যবান নয়; শুধু ফাস্ট ডিস্ক flushes এমন একটির সাথে আপনার সংগ্রহস্থলের সাব-সিস্টেম আপগ্রেড

দেখুন pg_test_fsyncসাহায্য করব যে আপনি নির্ধারণ এই জন্য আপনি একটি সমস্যা হতে পারে যদি একটি হাতিয়ার জন্য। বেশিরভাগ পোস্টগ্রিএসকিউএল প্যাকেজগুলি অবদানের অংশ হিসাবে এই সরঞ্জামটি ইনস্টল করে, তাই আপনার এটি সংকলনের প্রয়োজন হবে না। আপনি হাজার অপস দুয়েক / কম পেলে দ্বিতীয় pg_test_fsyncআপনি তারাতারি আপনার স্টোরেজ সিস্টেম আপগ্রেড করতে হবে। আমার এসএসডি-সজ্জিত ল্যাপটপটি 5000-7000 পাবে। আমার 4, ডিস্ক RAID 1000 অ্যারে 7200 আরপিএম এসটিএ ডিস্ক এবং রাইট-থ্রো (নন-রাইটিং-ক্যাচিং) এর সাথে আমার ওয়ার্কস্টেশনটি প্রায় 80 ওপ্স / সেকেন্ডে f_datasync, 20 টি অপস / সেকেন্ডে নেমে আসে fsync(); এটি কয়েকগুণ ধীর । তুলনা করুন: এসএসডি বনাম ওয়ার্কস্টেশন সহ ল্যাপটপটি লেখার মাধ্যমে (নন- রাইটিং -ক্যাচিং) RAID 10 দিয়ে। এই ল্যাপটপের এসএসডি সস্তা এবং আমি বিদ্যুতের ক্ষতিতে লেখার ক্যাশে ফ্লাশ করার জন্য অগত্যা বিশ্বাস করি না; আমি ভাল ব্যাকআপ রাখি এবং এটি আমার যত্ন নেওয়া ডেটার জন্য ব্যবহার করব না। ভাল মানের এসএসডিগুলি আরও ভাল না হলে ঠিক তেমন সঞ্চালন করে থাকে এবং লেখার টেকসই হয়।

আপনার আবেদনের ক্ষেত্রে, আমি আপনাকে দৃ strongly়ভাবে এটি দেখার পরামর্শ দিচ্ছি:

  • দ্রুত ফ্লাশ সহ একটি ভাল স্টোরেজ সাবসিস্টেম। আমি এটাকে যথেষ্ট চাপ দিতে পারি না। ভাল মানের পাওয়ার-ব্যর্থ-নিরাপদ এসএসডি এবং / অথবা পাওয়ার-সুরক্ষিত লিখিত-ব্যাক ক্যাশে সহ একটি RAID নিয়ামক।
  • ব্যবহার UNLOGGEDটেবিল ডেটার জন্য আপনি হারান সামর্থ। পর্যায়ক্রমে এটি লগ টেবিলগুলিতে একত্রিত করুন। উদাহরণস্বরূপ, অবরোধবিহীন টেবিলগুলিতে গেমস-ইন-প্রগ্রেস রাখুন এবং সাধারণ টেকসই টেবিলগুলিতে স্কোরগুলি লিখুন।
  • একটি ব্যবহার করে commit_delay(দ্রুত-ফ্লাশিং স্টোরেজ সহ কম দরকারী - ইঙ্গিত)
  • synchronous_commitলেনদেনের জন্য বন্ধ করা আপনি হারাতে পারবেন (দ্রুত-ফ্লাশিং স্টোরেজ সহ কম দরকারী - ইঙ্গিতের ইঙ্গিত)
  • পার্টিশন সারণী, বিশেষত সারণী যেখানে ডেটা "বয়স শেষ" এবং পরিষ্কার হয়ে যায়। পার্টিশনযুক্ত টেবিল থেকে মুছে ফেলার পরিবর্তে একটি পার্টিশন ফেলে দিন।
  • আংশিক সূচি
  • আপনার তৈরি সূচকের সংখ্যা হ্রাস করা। প্রতিটি সূচকের একটি লেখার ব্যয় থাকে।
  • বড় লেনদেনের জন্য ব্যাচিংয়ের কাজ
  • মূল ডিবি থেকে রিড লোড নিতে কেবল পঠনযোগ্য হট স্ট্যান্ডবাই প্রতিরূপ ব্যবহার করুন
  • ডেটা মেমচেড করা বা রেডিসের মতো ক্যাচিং স্তর ব্যবহার করে যা প্রায়শই পরিবর্তিত হয় বা বাসি হতে পারে। আপনি PostgreSQL টেবিলগুলিতে ট্রিগারগুলি ব্যবহার করে ক্যাশে অবৈধকরণ ব্যবহার করতে LISTENএবং করতে পারেন NOTIFY

সন্দেহ হলে: http://www.postgresql.org/support/professional_support/

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