লিনাক্সে সিস্টেম সিপিইউ / সিস্টেম কল পর্যবেক্ষণ করুন


9

আমার একটি দম্পতি প্রক্রিয়া রয়েছে যা প্রচুর সিস্টেম সিপিইউ সময় খাচ্ছে (ভিএমস্ট্যাট দেখে নির্ধারিত)। কোন ধরণের সিস্টেম কল করা হচ্ছে তা জানার কোনও সহজ উপায় আছে?

আমি জানি স্ট্রেস আছে, তবে কি আরও দ্রুত এবং সহজ উপায় আছে? সিস্টেম কলের জন্য কি "শীর্ষ" এর মতো কিছু রয়েছে?


1
স্ট্রেস হল সমাধান।
ওয়ার্নার

উত্তর:


15

আমি মনে করি -cপতাকাটির সাথে স্ট্রেস সম্ভবত আমার সবচেয়ে কাছের। আপনি যদি -cপতাকা ব্যবহার না করেন তবে এটি ব্যবহার করে দেখুন :

$  sudo strace -c -p 12345

যেখানে 12345 প্রশ্নযুক্ত প্রক্রিয়াটির প্রসেস আইডি (পিআইডি)। নোট করুন যে কোনও প্রক্রিয়া স্ট্রাক করা অতিরিক্ত ওভারহেড যুক্ত করে, সুতরাং আপনি যখন এটির সন্ধান করছেন তখন প্রক্রিয়াটি ধীর গতিতে চলবে।

এটি চালানোর পরে যদিও আপনি দীর্ঘকালীন ডেটা সংগ্রহ করতে চান, Ctrl-Cআপনার ডেটা সংগ্রহ এবং ফলাফলগুলি আউটপুট বন্ধ করতে টিপুন । এটি এরকম কিছু তৈরি করবে:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 31.88    0.001738         145        12           futex
 16.79    0.000915          11        80           tgkill
 12.36    0.000674          34        20           read
  9.76    0.000532         266         2           statfs
  8.42    0.000459          13        35           time
  4.38    0.000239           6        40           gettimeofday
  3.65    0.000199           4        48           sigprocmask
  2.94    0.000160          18         9           open
  2.88    0.000157          12        13           stat64
  1.32    0.000072           9         8           munmap
  0.90    0.000049           6         8           mmap2
  0.88    0.000048           3        14         7 sigreturn
  0.79    0.000043           5         9           close
  0.77    0.000042           4        10           rt_sigprocmask
  0.64    0.000035           3        12           setitimer
  0.55    0.000030           5         6         6 rt_sigsuspend
  0.53    0.000029           4         8           fstat64
  0.29    0.000016           8         2           setresuid32
  0.13    0.000007           4         2           _llseek
  0.09    0.000005           3         2           prctl
  0.04    0.000002           2         1           geteuid32
------ ----------- ----------- --------- --------- ----------------
100.00    0.005451                   341        13 total

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


2
ধিক্কার! মুষ্টি
গাইউস

2

নমুনা রক্ষাকারী প্রোফাইলগুলির মধ্যে একটি যেমন ওপ্রোফিল বা নতুন কার্নেলগুলির জন্য পারফ করার চেষ্টা করুন। আপনি যদি ভাগ্যবান হন তবে "পারফ শীর্ষ" আপনাকে কী চান তা সুনির্দিষ্টভাবে বলতে পারে। কিছু উদাহরণের জন্য এখানে দেখুন


2

আমি যে ধরণের স্ট্রেস সুইচগুলি ব্যবহার করি তা হ'ল এটি।

strace -ffttT -p pid -o /tmp/strace.out

এর একটি উদাহরণ দেখতে হবে,

19:35:57.485493 mprotect(0x7f35e7472000, 16384, PROT_READ) = 0 <0.000037>
19:35:57.485599 mprotect(0x7f35e7692000, 4096, PROT_READ) = 0 <0.000030>
19:35:57.485697 mprotect(0x7f35e78b7000, 4096, PROT_READ) = 0 <0.000030>
19:35:57.485782 munmap(0x7f35e7896000, 129588) = 0 <0.000037>
19:35:57.485875 set_tid_address(0x7f35e78949d0) = 10730 <0.000029>
19:35:57.485960 set_robust_list(0x7f35e78949e0, 0x18) = 0 <0.000024>
19:35:57.486048 futex(0x7fff8f58628c, FUTEX_WAKE_PRIVATE, 1) = 0 <0.000025>
19:35:57.486131 futex(0x7fff8f58628c, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1,       NULL, 7f35e7894700) = -1 EAGAIN (Resource temporarily unavailable) <0.000024>

আপনি সিস্টেম কলের ডানদিকে সময়ের পার্থক্য দেখান যে এটি দেখায় যে একটি সিস্টেম কল থেকে অন্য সিস্টেমে যেতে কত সময় লেগেছে।

এটি আপনাকে সিস্টেম কলগুলির মধ্যে সময়ের পার্থক্যটি ধরবে। সুতরাং, যখন আপনি দেখবেন যে একটি সিস্টেম কলের পরবর্তী সিস্টেম কলের সাথে বেশ কয়েক সেকেন্ডের ব্যবধান রয়েছে, তখন সেখানে এটি কিছুটা শব্দ করছে।

আরেকটি পদ্ধতি হ'ল এটি gcore দিয়ে coredump করা। তবে এর জন্য জিডিবির মাধ্যমে নেভিগেট করার জন্য একটু অভিজ্ঞতা দরকার।

তবে, যদি থ্রেডটি কার্নেল থ্রেড হয়, তবে আপনি এটিকে স্ট্রেস বা কর্ডার্প করতে পারবেন না। সেক্ষেত্রে আমাদের আরও জটিল কিছু ব্যবহার করতে হবে। RHEL5 কার্নেল-এ, আমরা অপ্রোফিল ব্যবহার করি। RHEL6 এ আমরা পারফ ব্যবহার করি। আমি অপ্রোফিলের চেয়ে পারফেক্ট পছন্দ করি। সিস্টেমের কল দেখায় যেখানে সিপিইউর সর্বাধিক শতাংশ ব্যবহার করা হচ্ছে সেগুলি দেখায় নিখুঁত ডেটা সংগ্রহ করা যেতে পারে format

একটি পরীক্ষার পারফ সঙ্গে, আমি এটি দেখতে।

38.06%  swapper  [kernel.kallsyms]  [k] mwait_idle_with_hints                                                                                                               ↑

29.45%  swapper  [kernel.kallsyms]  [k] read_hpet 
4.90%  swapper  [kernel.kallsyms]  [k] acpi_os_read_port                                                                                                                   ▒
4.74%  swapper  [kernel.kallsyms]  [k] hpet_next_event   

এটি কার্নেল ফাংশনটি দেখায় যেখানে 38% সিপিইউ সময় ব্যয় করা হচ্ছে। এখন, আমরা ফাংশনটি যাচাই করতে পারি এবং এটি কী করছে এবং এটি করার কথা বলে।

কয়েকটি উদাহরণ সহ, এটি এতটা কঠিন নয়।

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