অ্যামাজন আরডিএস মাইএসকিউএল ইনস্ট্যান্সে উচ্চ সিপিইউ ব্যবহার ডিবাগ করার জন্য সংগ্রাম


21

আমরা একটি এম 1 এক্সএলগার মাইএসকিউএল আরডিএস সার্ভার চালাচ্ছি এবং উচ্চ সিপিইউ ব্যবহারের সাথে কিছু সমস্যা রয়েছে। আমরা বেশ কয়েক সপ্তাহ আগে সিপিইউর ব্যবহারের একটি বড় উদাহরণে 100% পৌঁছে দিয়ে কিছু সমস্যা করেছি। যখন আমরা আকারটিকে বাড়িয়ে তুলি যখন কিছু সময়ের জন্য স্থিতিশীল হয়ে যায় তবে সিপিইউ ব্যবহার ধীরে ধীরে আবার ক্রপ আপ হয়।

গত সপ্তাহ বা তার জন্য সিপিইউ ব্যবহার 90 এর দশকের উচ্চতর অবস্থানে ছিল, গতকাল ধারাবাহিকভাবে 100% বা সেখানে পৌঁছেছিল, যা আমাদের উত্পাদন সাইটকে থামিয়ে দেয়। ডিবি সার্ভারটি রিবুট করার পরে, কয়েক ঘন্টাের মধ্যে সিপিইউ ব্যবহার একই স্তরে ফিরে যায়।

আমি মাইএসকিএল সার্ভারে শো প্রসেসলিস্টটি চালিয়েছি এবং মাইএসকিউএল প্রশাসকের মাধ্যমে এটি পর্যবেক্ষণ করেছি। বিশেষত দীর্ঘ-চলমান কোয়েরি বা উচ্চতর কোয়েরি নেই বলে মনে হচ্ছে। দীর্ঘ সময় ধরে ঘুমের রাজ্যে বেশ কয়েকটি প্রক্রিয়া রয়েছে ... এগুলি হল আমাদের মূল অ্যাপের বাইরে থাকা বিচ্ছিন্ন কর্মী ডেমন যা ডাটাবেসের সাথে যোগাযোগ করে। সার্ভারের নামগুলি পরিবর্তিত হয়ে সেগুলি কী সেগুলির একটি বিবরণ দেওয়ার জন্য আমি নীচের প্রসেসলিস্ট আউটপুটে অনুলিপি করেছি:

+------+----------+---------------------------------------------------+--------------+---------+-------+--------------+----------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+----------+---------------------------------------------------+--------------+---------+-------+--------------+----------------------------------------------------------------------------------------+
| 13 | rdsadmin | localhost:43513 | mysql | Sleep | 14 | | NULL |
| 15 | proddbuser | app-server-1.eu-west-1.compute.internal:36460 | proddb | Sleep | 46 | | NULL |
| 451 | proddbuser | app-server-1.eu-west-1.compute.internal:55512 | proddb | Sleep | 29 | | NULL |
| 912 | proddbuser | app-server-1.eu-west-1.compute.internal:45171 | proddb | Sleep | 13 | | NULL |
| 941 | proddbuser | app-server-1.eu-west-1.compute.internal:47353 | proddb | Sleep | 53 | | NULL |
| 951 | proddbuser | app-server-1.eu-west-1.compute.internal:48014 | proddb | Sleep | 37 | | NULL |
| 1009 | proddbuser | app-server-1.eu-west-1.compute.internal:51787 | proddb | Sleep | 36 | | NULL |
| 1041 | proddbuser | app-server-1.eu-west-1.compute.internal:53777 | proddb | Sleep | 14 | | NULL |
| 1572 | proddbuser | app-server-1.eu-west-1.compute.internal:42989 | proddb | Sleep | 3 | | NULL |
| 1592 | proddbuser | app-server-1.eu-west-1.compute.internal:43279 | proddb | Sleep | 162 | | NULL |
| 2909 | proddbuser | app-server-1.eu-west-1.compute.internal:37768 | proddb | Sleep | 35 | | NULL |
| 3028 | proddbuser | app-server-1.eu-west-1.compute.internal:42568 | proddb | Sleep | 5 | | NULL |
| 3119 | proddbuser | app-server-1.eu-west-1.compute.internal:46913 | proddb | Sleep | 76 | | NULL |
| 3189 | proddbuser | app-server-1.eu-west-1.compute.internal:51466 | proddb | Sleep | 5 | | NULL |
| 3216 | proddbuser | app-server-2.eu-west-1.compute.internal:44097 | proddb | Sleep | 14552 | | NULL |
| 3218 | proddbuser | app-server-2.eu-west-1.compute.internal:44099 | proddb | Sleep | 14552 | | NULL |
| 3219 | proddbuser | app-server-2.eu-west-1.compute.internal:44107 | proddb | Sleep | 44 | | NULL |
| 3220 | proddbuser | app-server-2.eu-west-1.compute.internal:44113 | proddb | Sleep | 26 | | NULL |
| 3223 | proddbuser | app-server-2.eu-west-1.compute.internal:44184 | proddb | Sleep | 50 | | NULL |
| 3224 | proddbuser | app-server-2.eu-west-1.compute.internal:44187 | proddb | Sleep | 1 | | NULL |
| 3226 | proddbuser | app-server-2.eu-west-1.compute.internal:44208 | proddb | Sleep | 33 | | NULL |
| 3229 | proddbuser | app-server-2.eu-west-1.compute.internal:44250 | proddb | Sleep | 14 | | NULL |
| 3232 | proddbuser | app-server-2.eu-west-1.compute.internal:44279 | proddb | Sleep | 26 | | NULL |
| 3233 | proddbuser | app-server-2.eu-west-1.compute.internal:44297 | proddb | Sleep | 31 | | NULL |
| 3237 | proddbuser | app-server-2.eu-west-1.compute.internal:44334 | proddb | Sleep | 27 | | NULL |
| 3239 | proddbuser | app-server-2.eu-west-1.compute.internal:44338 | proddb | Sleep | 11 | | NULL |
| 3241 | proddbuser | app-server-2.eu-west-1.compute.internal:44356 | proddb | Sleep | 26 | | NULL |
| 3260 | proddbuser | app-server-2.eu-west-1.compute.internal:44619 | proddb | Sleep | 8 | | NULL |
| 3337 | proddbuser | utility-server-1.eu-west-1.compute.internal:45193 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 309416 LIMIT 1 |
| 3419 | proddbuser | utility-server-1.eu-west-1.compute.internal:46136 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 284530 LIMIT 1 |
| 3463 | proddbuser | app-server-1.eu-west-1.compute.internal:59619 | proddb | Sleep | 9406 | | NULL |
| 3504 | proddbuser | utility-server-1.eu-west-1.compute.internal:47063 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 260571 LIMIT 1 |
| 3577 | proddbuser | app-server-1.eu-west-1.compute.internal:34394 | proddb | Sleep | 6734 | | NULL |
| 3585 | proddbuser | utility-server-1.eu-west-1.compute.internal:47990 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 231273 LIMIT 1 |
| 3664 | proddbuser | utility-server-1.eu-west-1.compute.internal:48909 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 201525 LIMIT 1 |
| 3716 | proddbuser | app-server-2.eu-west-1.compute.internal:56301 | proddb | Sleep | 27 | | NULL |
| 3748 | proddbuser | utility-server-1.eu-west-1.compute.internal:49850 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 167839 LIMIT 1 |
| 3771 | proddbuser | my-pc:30101 | NULL | Query | 0 | NULL | show processlist |
| 3831 | proddbuser | utility-server-1.eu-west-1.compute.internal:50785 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 123228 LIMIT 1 |
+------+----------+---------------------------------------------------+--------------+---------+-------+--------------+----------------------------------------------------------------------------------------+

আমার আরও বলা উচিত যে এই সময়কালে সাইটে ট্রাফিক অত্যন্ত কম থাকে, সাধারণ পিক আওয়ারের তুলনায়, আমরা শিখর সময়ে দেখা প্রায় 10% বোঝা।

আমাদের কাছে নতুন রিলিক মনিটরিং রয়েছে যা আমাদের দেখায় যে সবচেয়ে বেশি সময় ব্যয়কারী অ্যাপ্লিকেশন ডেটাবেস কলগুলি কী। এটি আমাদের দেখায় যে একটি নির্দিষ্ট কল যা আমাদের অ্যাপ্লিকেশন ডিবিতে সময় কাটায় তার 99% শতাংশ অ্যাকাউন্টে আইডি ক্যোয়ারির মাধ্যমে সন্ধান করা সহজ:

SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`id` = 123 LIMIT 1

(উপরের প্রসেসলিস্টে যে প্রশ্নগুলি চলছিল তা সম্পূর্ণ এক নয়)

এই অনুরোধটি গত সপ্তাহ বা তার চেয়ে ধীরে ধীরে বেড়েছে, সময়ের অনুরোধগুলির মধ্যে স্ট্যান্ডার্ড বিচ্যুতি বাড়ার সাথে সাথে সেকেন্ডের ক্ষেত্রে এটি সর্বাধিক সময় নির্ধারণ করে takes আমি মনে করি এটি কোনও কারণের চেয়ে সিপিইউ ব্যবহারের সমস্যার ফল মাত্র।

এই টেবিলটিতে প্রায় 80,000 সারি রয়েছে তাই বিশাল নয়। আশা করা যায় যে ডাটাবেসে থাকা বেশিরভাগ অ্যাপ্লিকেশনের সময়টি এই টেবিলটিতে রেকর্ড সন্ধান করতে ব্যয় করা হয়, অ্যাপটির মূল কার্যকারিতা এটিকে কেন্দ্র করে তৈরি করা হয়। আমি আমার অ্যাপ সার্ভার থেকে প্রোডাকশন ডাটাবেসে কয়েকবার একই জাতীয় ক্যোয়ারী চালিয়েছি, যখন সিপিইউ ব্যবহার প্রায় 100% থাকে এবং এটি 1 বা 2 এমএসের মধ্যে সাড়া দেয়।

উপরের সমস্তটির উপর ভিত্তি করে, আমরা কীভাবে আমাদের ডিবাগিংয়ের সাথে এগিয়ে চলব তা নিশ্চিত নই। কারও কি ধারণা ছিল যে কী ধরণের জিনিসগুলি মূল কারণ হতে পারে এবং কীভাবে এগুলি তদন্ত করবে? আমাদের ডিবি সার্ভারটি চালিত অন্তর্নিহিত সার্ভারটিতে অ্যাক্সেস সীমাবদ্ধ কারণ এটি একটি অ্যামাজন আরডিএস উদাহরণ।


উত্তর:


14

এটি সমাধান করার জন্য পরিচালিত, এই পদক্ষেপগুলি আমি অনুসরণ করেছি:

প্রথমত, আমি তাদের আলোচনা ফোরামে পোস্ট করে অ্যামাজন আরডিএস টিমের সাথে যোগাযোগ করেছি, তারা নিশ্চিত করেছে যে এটি সমস্ত সিপিইউ গ্রহণ করা মাইএসকিএলড প্রক্রিয়া ছিল - এটি শারীরিক সার্ভারে চলমান অন্য কিছুতে একটি কনফিগারেশন ত্রুটি দূর করেছে this

দ্বিতীয়ত আমি যে প্রশ্নগুলি চালাচ্ছিলাম তার উত্সটি সন্ধান করেছি:

SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 231273 LIMIT 1 

আমি মূলত এটিকে কারণ হিসাবে অগ্রাহ্য করেছি, কারণ আমি শো প্রসেসলিস্ট আউটপুট পর্যবেক্ষণ করার সময় এই প্রশ্নের কোনওোটাই বিশেষত বেশি সময় নিচ্ছে না বলে মনে হয়। অন্যান্য উপায় অবসন্ন করার পরে, আমি স্থির করেছি যে এটি অনুসরণ করা উপযুক্ত হবে .... এবং আমি আনন্দিত যে আমি এটি করেছি।

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

আলগাভাবে এই গাইড অনুসরণ:

http://www.mysqlperformanceblog.com/2007/02/08/debugging-sleeping-connections-with-mysql/

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

এমন কিছু যা পরিস্থিতিকে আরও খারাপ করছে, মনে হচ্ছে ক্রোন জবটি কনফিগার করা হয়েছে এবং প্রত্যেকে কতক্ষণ সময় নিয়েছিল বলে একই সময়ে একই প্রক্রিয়া চলার 6 টি উদাহরণ রয়েছে! আমি এই প্রক্রিয়াগুলি বন্ধ করে দিয়েছি এবং অবিশ্বাস্যভাবে আমাদের সিপিইউ ব্যবহার প্রায় 100% থেকে প্রায় 5% এ নেমেছে!

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