একটি postgres প্রক্রিয়া হত্যা -9


25

একটি পোস্টগ্রিজ SELECT কোয়েরি আমাদের ডিবি সার্ভারের নিয়ন্ত্রণের বাইরে চলে গেছে এবং সার্ভারের স্মৃতিশক্তি শেষ না হওয়া পর্যন্ত প্রচুর মেমরি এবং অদলবদল শুরু করে। আমি নির্দিষ্ট প্রক্রিয়াটি পেয়েছি ps aux | grep postgresএবং দৌড়েছি kill -9 pid। এটি প্রক্রিয়াটিকে মেরে ফেলেছিল এবং প্রত্যাশা অনুযায়ী স্মৃতি মুক্ত হয়। সিস্টেম এবং পোস্টগ্রিসের অবশিষ্ট প্রশ্নগুলি অকার্যকর বলে মনে হয়েছিল। এই সার্ভারটি এসইএলএস 9 এসপি 4 এ 9.1.3 পোস্টগ্রেস চলছে।

তবে, আমাদের বিকাশকারীদের একজন পোস্টগ্রিজ প্রক্রিয়াটি হত্যার জন্য আমাকে চিবিয়ে kill -9দিলেন, এটি বলেছিলেন যে এটি পুরো পোস্টগ্রিজ পরিষেবাটি নিবে। বাস্তবে তা হয়নি। আমি কয়েকবার আগে এটি করেছি এবং কোনও নেতিবাচক পার্শ্ব প্রতিক্রিয়া দেখিনি।

এই কথাটি বলে এবং আরও পড়ার পরে, দেখে মনে হচ্ছে kill pidযে পতাকা ছাড়াই পলাতক পোস্টগ্রাস প্রক্রিয়াটি হ'ল পছন্দ করা উপায়, তবে পোস্টগ্রিস সম্প্রদায়ের অন্যান্য ব্যবহারকারীর মতো এটিও মনে হয় যে পোস্টগ্র্রেস বছরের পর বছর ধরে "আরও ভাল হয়েছে" that kill -9একটি পৃথক ক্যোয়ারী প্রক্রিয়া / থ্রেড এখন আর মৃত্যুদণ্ড নয়।

কেউ কি পালিয়ে যাওয়ার পোস্টগ্রিজ প্রক্রিয়াটি মেরে ফেলার সঠিক পথে এবং kill -9সেই সাথে পোস্টগ্রিসের সাথে আজকাল কতটা বিপর্যয়কর (বা সৌম্য) ব্যবহার করছে তা আমাকে আলোকিত করতে পারে ? অন্তর্দৃষ্টি জন্য ধন্যবাদ।

উত্তর:


31

voretaq7 এর উত্তর মূল পয়েন্টগুলি সহ, ব্যাকেন্ডগুলি সমাপ্ত করার সঠিক উপায় সহ তবে আমি আরও একটি ব্যাখ্যা যুক্ত করতে চাই more

kill -9(অর্থাত্ SIGKILL) কখনও কখনও কখনও আপনার প্রথম পছন্দ ডিফল্ট হওয়া উচিত নয় । প্রক্রিয়াটি যখন সাধারণ শাটডাউন অনুরোধগুলিতে সাড়া না দেয় এবং এটি SIGTERM( kill -15) এর কোনও প্রভাব পড়ে না তখন এটি আপনার শেষ অবলম্বন হওয়া উচিত । এটি পিজির সত্য এবং আরও অনেক কিছু।

kill -9 নিহত প্রক্রিয়াটিকে কোনও ক্লিনআপ করার কোনও সুযোগ দেয় না।

পোস্টগ্র্রেএসকিউএল এর কথা এলে, পিজি এমন একটি ব্যাকড দেখতে পায় যা kill -9ব্যাকড ক্র্যাশ হিসাবে শেষ হয় । এটি জানে যে ব্যাকএন্ডে শেয়ার্ড মেমোরিটি দূষিত হতে পারে - কারণ আপনি একটি পৃষ্ঠার shm লিখতে বা একটি পরিবর্তন করার মাধ্যমে অর্ধেক পথ এটিকে বাধা দিতে পারতেন, উদাহরণস্বরূপ - সুতরাং এটি যখন ব্যাকএন্ড হঠাৎ নিখোঁজ হয়ে গেছে তখন লক্ষ্য করা যায় যে এটি সমস্ত অন্যান্য ব্যাককেন্ড সমাপ্ত করে এবং পুনরায় চালু করে it এবং একটি শূন্য-ত্রুটি কোড সহ প্রস্থান করা হয়েছে।

আপনি লগগুলিতে এই প্রতিবেদনিত দেখতে পাবেন।

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

বিটিডাব্লু, আপনি যদি kill -9পোস্টমাস্টার হন তবে postmaster.pidপ্রতিটি postgresব্যাকএন্ড চলে গেছে তা নিশ্চিত না করে আবার মুছে ফেলুন এবং এটি আবার শুরু করুন , খুব খারাপ জিনিস ঘটতে পারে । এটি সহজেই ঘটতে পারে যদি আপনি ঘটনাক্রমে ব্যাকএন্ডের পরিবর্তে পোস্টমাস্টারকে হত্যা করেন, ডাটাবেসটি নীচে নেমে গেছে, এটি পুনরায় চালু করার চেষ্টা করেছে, পুনরায় আরম্ভ করতে ব্যর্থ হলে "বাসি" .pid ফাইলটি সরিয়ে নিয়ে আবার পুনরায় আরম্ভ করার চেষ্টা করলে এটি সহজেই ঘটতে পারে। পিজির kill -9চারপাশে wেউ এড়ানো উচিত এমন একটি কারণ এবং এটি মুছে ফেলা উচিত নয় postmaster.pid

একটি প্রদর্শন:

আপনি kill -9ব্যাকএন্ডে আসলে কী ঘটে তা দেখতে , এই সাধারণ পদক্ষেপগুলি ব্যবহার করে দেখুন। দুটি টার্মিনাল খুলুন, প্রতিটিটিতে এবং প্রতিটি রানে পিএসকিএল খুলুন SELECT pg_backend_pid();। অন্য টার্মিনালে kill -9একটি পিআইডি। এখন SELECT pg_backend_pid();আবার দুটি পিএসএইচএল সেশনে চালান । তারা উভয় তাদের সংযোগ হারিয়ে কীভাবে লক্ষ্য করুন ?

সেশন 1, যা আমরা হত্যা করেছি:

$ psql regress
psql (9.1.4)
Type "help" for help.

regress=# select pg_backend_pid();
 pg_backend_pid 
----------------
           6357
(1 row)

[kill -9 of session one happens at this point]

regress=# select pg_backend_pid();
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
regress=# select pg_backend_pid();
 pg_backend_pid 
----------------
           6463
(1 row)

অধিবেশন 2, যা জামানত ক্ষতি ছিল:

$ psql regress
psql (9.1.4)
Type "help" for help.

regress=# select pg_backend_pid();
 pg_backend_pid 
----------------
           6283
(1 row)

[kill -9 of session one happens at this point]

regress=# select pg_backend_pid();
WARNING:  terminating connection because of crash of another server process
DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
HINT:  In a moment you should be able to reconnect to the database and repeat your command.
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
regress=# select pg_backend_pid();
 pg_backend_pid 
----------------
           6464
(1 row)

উভয় অধিবেশনটি কীভাবে ভেঙে গেছে দেখুন? এজন্য আপনি kill -9ব্যাকএন্ড করবেন না ।


1
সমস্ত খুব ভাল উত্তর এখানে, এবং খুব নম্রতা আমি যোগ করতে পারে। আমি সেগুলি সমস্ত গ্রহণযোগ্য হিসাবে চিহ্নিত করতে পারি, তবে @ ক্রেইগ রিঞ্জারের এখানে কিছু অতিরিক্ত পয়েন্ট রয়েছে এবং এটি সত্যই এটি চালিয়ে যায়। আমার খারাপ অভ্যাসগুলি আমাকে পরিষ্কার করার জন্য আবার এসএফকে ধন্যবাদ!
বাঞ্জার

2
@ ক্রেইগ: কি দুর্দান্ত প্রতিক্রিয়া; এবং একটি বিক্ষোভ অন্তর্ভুক্ত করার জন্য, আমি আশা করি আমি এই 100x ভোট দিতে পারব। আমি একজন সফ্টওয়্যার বিকাশকারী যিনি প্রতিদিন পিজির সাথে কাজ করেন এবং x.x দিন থেকে এবং আপনার প্রতিক্রিয়া স্পট! নিস!
কিলো

2
চমৎকার উত্তর. একটি সংযোজন: যদি আপনার একটি ব্যাকএন্ড প্রক্রিয়া থাকে যা একেবারে মরে না - pg_terminate_backendকোনও সার্ভার স্ট্যাক পুনরায় চালু না করে নয়, কোনও কিছুর সাথে নয়, আপনি এটি চাইলে এটি মেরে ফেলতে পারেন তবে নিশ্চিত করুন যে আপনার ডাটাবেসের একটি ওয়ার্কিং ব্যাকআপ রয়েছে। আপনি এটি করতে পারেন কয়েকটি উপায়: আপনি আপনার ডেটা ডিরেক্টরিটি ব্যাক আপ করতে pg_basebackupবা অনুরূপ (বা ঠিক rsyncএবং pg_start\stop_backup) ব্যবহার করতে পারেন (চালিয়ে যাওয়ার আগে ব্যাকআপগুলি পরীক্ষা করুন!) অথবা আপনি pg_dump[all]আপনার ডেটা উদ্ধারে ব্যবহার করতে পারেন । তবেই আপনার বিবেচনা করা উচিত kill -9, বা একটি রিবুট করা উচিত বা যাই হোক না কেন।
জ্যাক বি

1
@ জ্যাকবি ইয়েপ, এবং আপনি যদি এটি হত্যা করেন তবে নিশ্চিত হন যে সমস্ত ব্যাকেন্ড মরে গেছে। সর্বাধিক অত্যাবশ্যকরূপে, কখনো মুছতে postmaster.pid। কখনো।
ক্রেগ রিঞ্জার

29

I found the particular process via ps aux | grep postgres and ran kill -9 pid.
না! খারাপ! পিছনে থেকে এখনই এগিয়ে যান!

সিরিয়াসলি - পোস্টগ্র্রেস ব্যাকএন্ডগুলি এরকমভাবে হত্যা করবেন না - মারাত্মক জিনিসগুলি ঘটতে পারে (এমনকি 7.x দিন পরে যে সমস্ত স্থায়িত্ব বর্ধন করা হয়েছিল) যা আপনার পুরো ডিবি ট্র্যাশ করতে পারে, এবং আপনার বিকাশকারী চিবিয়ে খাওয়া বেশ সঠিক আপনি এটি করার জন্য বাইরে।

প্রকৃতপক্ষে পোস্টগ্রিসের মধ্যে থেকে এটি করার একটি আশীর্বাদযুক্ত এবং অনুমোদিত উপায় রয়েছে - এটি এমনকি পোস্টগ্র্যাস ম্যানুয়ালটিতে রয়েছে যদিও এসও পোস্ট এটি ব্যাখ্যা করার চেয়ে আরও ভাল কাজ করে ...

SELECT pg_cancel_backend(pid)
SIGINTনির্দিষ্ট ব্যাকএন্ডে একটি বাতিল ( ) সিগন্যাল প্রেরণ করে , যা বর্তমানে চলমান কোয়েরি বাতিল করে।

select pg_terminate_backend(pid)
SIGTERMনির্দিষ্ট ব্যাকএন্ডে একটি সমাপ্তি ( ) সিগন্যাল প্রেরণ করে , যা কোয়েরি বাতিল করে এবং ব্যাকএন্ডটি বাতিল করে (এর সংযোগটি বাদ দিচ্ছে)।

ব্যাকএন্ড আইডিগুলি pg_stat_activityটেবিল থেকে পাওয়া যায় (বা ps)


4
যদি কেউ ভয়াবহ বিষয় সম্পর্কে ভেবে অবাক হয়, kill -9তবে হত্যার প্রক্রিয়াটি যতটা হ'ল হঠাৎ করে সিস্টেমটিকে শক্তিশালী করা তার থেকে আলাদা নয়: পিজি ব্যাকএন্ড ক্র্যাশগুলির পক্ষে খুব সহনশীল (এর মতো kill -9) এবং কখনও ডেটা দুর্নীতি হওয়া উচিত নয়। সেখানে হবে দুর্নীতি যদি তোমাকে হত্যা করা পোস্টমাস্টার , অপসারণ postmaster.pid, এবং এছাড়াও প্রথম যে ব্যাকএন্ড হত্যা ছাড়াই এটি পুনরায় আরম্ভ করুন। যে হবে আপনার ডাটাবেস ধ্বংস, কিন্তু মাত্র চেয়ে বেশি প্রচুর সময় লাগে kill -9একটি ব্যাকএন্ড করতে। kill -9পোস্টমাস্টারকে ব্যাকএন্ডগুলি মারার সময় দেয় না, এ কারণেই এটি বিপজ্জনক।
ক্রেগ রিঞ্জার

2
... আমি গত সপ্তাহে জরুরী পরামর্শের মতো করেছিলাম। খারাপভাবে তাদের ডেটাবেসকে দূষিত করেছে, দু'দিনের কাজ হারিয়েছে কারণ তাদের ব্যাকআপগুলি ব্যর্থ হয়েছিল (এবং তারা তাদের পুনরুদ্ধারগুলি স্বয়ংক্রিয়ভাবে পরীক্ষা করেনি), 48 ঘন্টা ডাউন ছিল। মুছবেন না postmaster.pid
ক্রেগ রিঞ্জার

8

একটি পোস্টগ্রাইএসকিউএল ক্লায়েন্ট প্রক্রিয়া মেরে ফেলা উচিত। পোস্টগ্রিসএসকিউএল ডেমন প্রক্রিয়াটি হত্যার ফলে আপনাকে তিরস্কার করা যেতে পারে।

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

স্ট্যাকওভারফ্লো থেকে পোস্টগ্রিএসকিউএল এ এসকিউএল কোয়েরি চালাও (দীর্ঘ) দেখুন ।


4
kill -9যাইহোক যাইহোক আপনার ডিফল্ট পছন্দ হওয়া উচিত নয়, এটি একটি শেষ অবলম্বন। এর SIGTERMসাথে kill -TERMবা সরল প্রেরণ করুন killএবং যদি প্রাপক কিছুক্ষণ পরে প্রতিক্রিয়া না জানায় তবেই আপনার বিবেচনা করা উচিত kill -KILL( kill -9)।
ক্রেগ রিঞ্জার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.