ftrace ব্যবহার করুন

লিনাক্স কার্নেলের ভিতরে কী ঘটছে তা বোঝার জন্য ftrace একটি ডিবাগিং টুল। নিম্নলিখিত বিভাগগুলি মৌলিক ftrace কার্যকারিতা, অ্যাট্রেসের সাথে ftrace ব্যবহার (যা কার্নেল ইভেন্টগুলি ক্যাপচার করে), এবং গতিশীল ftrace বিস্তারিত করে।

উন্নত ftrace কার্যকারিতা সম্পর্কে বিশদ বিবরণের জন্য যা systrace থেকে উপলব্ধ নয়, <kernel tree>/Documentation/trace/ftrace.txt এ ftrace ডকুমেন্টেশন পড়ুন।

অ্যাট্রেস দিয়ে কার্নেল ইভেন্ট ক্যাপচার করুন

atrace ( frameworks/native/cmds/atrace ) কার্নেল ইভেন্ট ক্যাপচার করতে ftrace ব্যবহার করে। পরিবর্তে, systrace.py (বা Catapult এর পরবর্তী সংস্করণগুলিতে run_systrace.py) ডিভাইসে অ্যাট্রেস চালানোর জন্য adb ব্যবহার করে। atrace নিম্নলিখিত কাজ করে:

  • একটি সম্পত্তি ( debug.atrace.tags.enableflags ) সেট করে ব্যবহারকারী-মোড ট্রেসিং সেট আপ করে।
  • উপযুক্ত ftrace sysfs নোডগুলিতে লিখে পছন্দসই ftrace কার্যকারিতা সক্ষম করে। যাইহোক, যেহেতু ftrace আরও বৈশিষ্ট্য সমর্থন করে, আপনি নিজে কিছু sysfs নোড সেট করতে পারেন তারপর atrace ব্যবহার করতে পারেন।

বুট-টাইম ট্রেসিং বাদ দিয়ে, প্রপার্টিটিকে উপযুক্ত মান সেট করতে অ্যাট্রেস ব্যবহার করার উপর নির্ভর করুন। সম্পত্তিটি একটি বিটমাস্ক এবং উপযুক্ত হেডার (যা অ্যান্ড্রয়েড রিলিজের মধ্যে পরিবর্তিত হতে পারে) দেখার ব্যতীত সঠিক মান নির্ধারণের কোন ভাল উপায় নেই।

ftrace ইভেন্ট সক্রিয় করুন

ftrace sysfs নোডগুলি /sys/kernel/tracing এ রয়েছে এবং ট্রেস ইভেন্টগুলিকে /sys/kernel/tracing/events এ ভাগ করা হয়েছে।

প্রতি-বিভাগের ভিত্তিতে ইভেন্টগুলি সক্ষম করতে, ব্যবহার করুন:

echo 1 > /sys/kernel/tracing/events/irq/enable

প্রতি-ইভেন্ট ভিত্তিতে ইভেন্টগুলি সক্ষম করতে, ব্যবহার করুন:

echo 1 > /sys/kernel/tracing/events/sched/sched_wakeup/enable

যদি অতিরিক্ত ইভেন্টগুলি sysfs নোডগুলিতে লেখার মাধ্যমে সক্রিয় করা হয়, তবে সেগুলি atrace দ্বারা পুনরায় সেট করা হবে না । কোয়ালকম ডিভাইস আনার জন্য একটি সাধারণ প্যাটার্ন হল kgsl (GPU) এবং mdss (ডিসপ্লে পাইপলাইন) ট্রেসপয়েন্ট সক্রিয় করা এবং তারপর অ্যাট্রেস বা সিস্ট্রেস ব্যবহার করা:

adb shell "echo 1 > /sys/kernel/tracing/events/mdss/enable"
adb shell "echo 1 > /sys/kernel/tracing/events/kgsl/enable"
./systrace.py sched freq idle am wm gfx view binder_driver irq workq ss sync -t 10 -b 96000 -o full_trace.html

আপনি atrace বা systrace ছাড়াই ftrace ব্যবহার করতে পারেন, যা আপনি যখন শুধুমাত্র কার্নেল ট্রেস চান (অথবা যদি আপনি হাতে ইউজার-মোড ট্রেসিং প্রপার্টি লিখতে সময় নেন) তখন এটি কার্যকর। শুধু ftrace চালানোর জন্য:

  1. আপনার ট্রেসের জন্য যথেষ্ট বড় একটি মান বাফার আকার সেট করুন:
    echo 96000 > /sys/kernel/tracing/buffer_size_kb
    
  2. ট্রেসিং সক্ষম করুন:
    echo 1 > /sys/kernel/tracing/tracing_on
    
  3. আপনার পরীক্ষা চালান, তারপর ট্রেসিং অক্ষম করুন:
    echo 0 > /sys/kernel/tracing/tracing_on
    
  4. ট্রেস ডাম্প করুন:
    cat /sys/kernel/tracing/trace > /data/local/tmp/trace_output
    

ট্রেস_আউটপুট টেক্সট আকারে ট্রেস দেয়। Catapult ব্যবহার করে এটি কল্পনা করতে, GitHub থেকে Catapult সংগ্রহস্থলটি পান এবং trace2html চালান:

catapult/tracing/bin/trace2html ~/path/to/trace_file

ডিফল্টরূপে, এটি একই ডিরেক্টরিতে trace_file.html লিখে।

ইভেন্টগুলিকে সম্পর্কযুক্ত করুন

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

একটি Catapult ইভেন্ট থেকে একটি প্রদত্ত ftrace ইভেন্ট খুঁজে পেতে:

  1. কাঁচা ftrace লগ খুলুন. systrace এর সাম্প্রতিক সংস্করণে ট্রেস ডিফল্টরূপে সংকুচিত হয়:
    • আপনি যদি --no-compress দিয়ে আপনার সিস্ট্রেস ক্যাপচার করেন, তাহলে এটি BEGIN TRACE দিয়ে শুরু হওয়া বিভাগে html ফাইলে রয়েছে।
    • যদি না হয়, ক্যাটাপল্ট ট্রি থেকে html2trace চালান ( tracing/bin/html2trace ) ট্রেসটিকে কম্প্রেস করতে।
  2. ক্যাটাপল্ট ভিজ্যুয়ালাইজেশনে আপেক্ষিক টাইমস্ট্যাম্প খুঁজুন।
  3. tracing_mark_sync ধারণকারী ট্রেসের শুরুতে একটি লাইন খুঁজুন। এটি এই মত কিছু দেখা উচিত:
    <5134>-5134  (-----) [003] ...1    68.104349: tracing_mark_write: trace_event_clock_sync: parent_ts=68.104286
    

    যদি এই লাইনটি বিদ্যমান না থাকে (অথবা যদি আপনি অ্যাট্রেস ছাড়াই ftrace ব্যবহার করেন), তাহলে সময়গুলি ftrace লগের প্রথম ইভেন্ট থেকে আপেক্ষিক হবে।
    1. parent_ts (সেকেন্ডে) মানের সাথে আপেক্ষিক টাইমস্ট্যাম্প (মিলিসেকেন্ডে) যোগ করুন।
    2. নতুন টাইমস্ট্যাম্প অনুসন্ধান করুন.

এই পদক্ষেপগুলি আপনাকে ইভেন্টে (বা অন্তত খুব কাছাকাছি) রাখতে হবে।

গতিশীল ftrace ব্যবহার করুন

যখন systrace এবং স্ট্যান্ডার্ড ftrace অপর্যাপ্ত হয়, তখন একটি শেষ অবলম্বন পাওয়া যায়: গতিশীল ftrace । ডায়নামিক ftrace বুট করার পরে কার্নেল কোড পুনর্লিখন জড়িত, এবং ফলস্বরূপ এটি নিরাপত্তার কারণে উৎপাদন কার্নেলে উপলব্ধ নয়। যাইহোক, 2015 এবং 2016 এর প্রতিটি কঠিন পারফরম্যান্স বাগ শেষ পর্যন্ত গতিশীল ftrace ব্যবহার করে রুট-সৃষ্ট হয়েছিল। এটি নিরবচ্ছিন্ন ঘুম ডিবাগ করার জন্য বিশেষভাবে শক্তিশালী কারণ আপনি যখনই নিরবচ্ছিন্ন ঘুমের ট্রিগার ফাংশনটি আঘাত করেন তখন আপনি কার্নেলে একটি স্ট্যাক ট্রেস পেতে পারেন। আপনি বাধা এবং প্রিম্পশনগুলি অক্ষম করে বিভাগগুলি ডিবাগ করতে পারেন, যা সমস্যাগুলি প্রমাণ করার জন্য খুব কার্যকর হতে পারে।

ডাইনামিক ftrace চালু করতে, আপনার কার্নেলের ডিফকনফিগ সম্পাদনা করুন:

  1. CONFIG_STRICT_MEMORY_RWX সরান (যদি এটি উপস্থিত থাকে)। আপনি যদি 3.18 বা নতুন এবং আর্ম64 এ থাকেন তবে এটি সেখানে নেই।
  2. নিম্নলিখিত যোগ করুন: CONFIG_DYNAMIC_FTRACE=y, CONFIG_FUNCTION_TRACER=y, CONFIG_IRQSOFF_TRACER=y, CONFIG_FUNCTION_PROFILER=y, এবং CONFIG_PREEMPT_TRACER=y
  3. নতুন কার্নেল পুনর্নির্মাণ এবং বুট করুন।
  4. উপলব্ধ ট্রেসারগুলি পরীক্ষা করতে নিম্নলিখিতটি চালান:
    cat /sys/kernel/tracing/available_tracers
    
  5. কমান্ড রিটার্ন function , irqsoff , preemptoff , এবং preemptirqsoff নিশ্চিত করুন।
  6. গতিশীল ftrace কাজ করছে তা নিশ্চিত করতে নিম্নলিখিতটি চালান:
    cat /sys/kernel/tracing/available_filter_functions | grep <a function you care about>
    

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

ফাংশন প্রোফাইলার হল পারফরম্যান্স সমস্যার জন্য সর্বোত্তম বিকল্প এবং প্রায়শই একটি ফাংশন কোথায় কল করা হচ্ছে তা খুঁজে বের করতে ব্যবহৃত হয়।

এই সমস্যায়, HDR+ ফটো তোলার জন্য একটি Pixel XL ব্যবহার করে তারপরে অবিলম্বে ভিউফাইন্ডার ঘোরানোর ফলে প্রতিবার জ্যাঙ্ক হয়। আমরা এক ঘন্টারও কম সময়ে সমস্যাটি ডিবাগ করতে ফাংশন প্রোফাইলার ব্যবহার করেছি। উদাহরণটি অনুসরণ করতে, ট্রেসের জিপ ফাইলটি ডাউনলোড করুন (যা এই বিভাগে উল্লেখ করা অন্যান্য ট্রেসগুলিও অন্তর্ভুক্ত করে), ফাইলটি আনজিপ করুন এবং আপনার ব্রাউজারে trace_30898724.html ফাইলটি খুলুন৷

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

এই মুহুর্তে আমাদের জানতে হবে ion_client_destroy কে কল করছে, তাই ফাংশন প্রোফাইলার ব্যবহার করার সময় এসেছে:

  1. যেহেতু ফাংশনগুলি মাঝে মাঝে কম্পাইলার দ্বারা পুনঃনামকরণ করা হয়, ব্যবহার করে নিশ্চিত করুন ion_client_destroy আছে:
    cat /sys/kernel/tracing/available_filter_functions | grep ion_client_destroy
    
  2. এটি নিশ্চিত করার পরে, এটি ftrace ফিল্টার হিসাবে ব্যবহার করুন:
    echo ion_client_destroy > /sys/kernel/tracing/set_ftrace_filter
    
  3. ফাংশন প্রোফাইলার চালু করুন:
    echo function > /sys/kernel/tracing/current_tracer
    
  4. যখনই একটি ফিল্টার ফাংশন কল করা হয় স্ট্যাক ট্রেস চালু করুন:
    echo func_stack_trace > /sys/kernel/tracing/trace_options
    
  5. বাফার আকার বাড়ান:
    echo 64000 > /sys/kernel/tracing/buffer_size_kb
    
  6. ট্রেসিং চালু করুন:
    echo 1 > /sys/kernel/tracing/trace_on
    
  7. পরীক্ষা চালান এবং ট্রেস পান:
    cat /sys/kernel/tracing/trace > /data/local/tmp/trace
    
  8. প্রচুর এবং প্রচুর স্ট্যাকের ট্রেস দেখতে ট্রেসটি দেখুন:
        cameraserver-643   [003] ...1    94.192991: ion_client_destroy <-ion_release
        cameraserver-643   [003] ...1    94.192997: <stack trace>
     => ftrace_ops_no_ops
     => ftrace_graph_call
     => ion_client_destroy
     => ion_release
     => __fput
     => ____fput
     => task_work_run
     => do_notify_resume
     => work_pending
     

আয়ন ড্রাইভারের পরিদর্শনের উপর ভিত্তি করে, আমরা দেখতে পাচ্ছি যে ion_client_destroy একটি ইউজারস্পেস ফাংশন দ্বারা স্প্যাম করা হচ্ছে একটি fd কে /dev/ion বন্ধ করে, একটি র্যান্ডম কার্নেল ড্রাইভার নয়। \"/dev/ion\" এর জন্য অ্যান্ড্রয়েড কোডবেস অনুসন্ধান করে, আমরা দেখতে পাই যে অনেক বিক্রেতা ড্রাইভার হেক্সাগন ড্রাইভারের মতো একই কাজ করছে এবং প্রতিবার প্রয়োজনে /dev/ion (একটি নতুন আয়ন ক্লায়েন্ট তৈরি এবং ধ্বংস করা) খোলা/বন্ধ করছে। নতুন আয়ন বরাদ্দ। প্রক্রিয়াটির আজীবনের জন্য একটি একক আয়ন ক্লায়েন্ট ব্যবহার করার জন্য সেগুলিকে পরিবর্তন করা বাগ সংশোধন করে।


ফাংশন প্রোফাইলার থেকে ডেটা যথেষ্ট নির্দিষ্ট না হলে, আপনি ফাংশন প্রোফাইলারের সাথে ftrace ট্রেসপয়েন্ট একত্রিত করতে পারেন। ftrace ইভেন্টগুলি স্বাভাবিকের মতো ঠিক একইভাবে সক্রিয় করা যেতে পারে এবং সেগুলি আপনার ট্রেসের সাথে ইন্টারলেভ করা হবে। আপনি ডিবাগ করতে চান এমন একটি নির্দিষ্ট ফাংশনে মাঝে মাঝে দীর্ঘ নিরবচ্ছিন্ন ঘুম থাকলে এটি দুর্দান্ত: আপনি যে ফাংশনটি চান তাতে ftrace ফিল্টার সেট করুন, ট্রেসপয়েন্ট সক্রিয় করুন, একটি ট্রেস নিন। আপনি ফলাফল ট্রেসটিকে trace2html দিয়ে পার্স করতে পারেন, আপনি যে ইভেন্টটি চান তা খুঁজে বের করতে পারেন, তারপর কাঁচা ট্রেসে কাছাকাছি স্ট্যাক ট্রেস পেতে পারেন।

লকস্ট্যাট ব্যবহার করুন

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

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

এই ইস্যুতে, SCHED_FIFO থ্রেড স্থগিত হয়ে যায় যখন সমস্ত কোর নন-SCHED_FIFO থ্রেডের সাথে সর্বাধিক লোড হয়। আমাদের কাছে VR অ্যাপে একটি fd-এ উল্লেখযোগ্য লক বিতর্ক দেখানোর ট্রেস ছিল, কিন্তু আমরা সহজেই ব্যবহার করা fd শনাক্ত করতে পারিনি। উদাহরণটি অনুসরণ করতে, ট্রেসের জিপ ফাইলটি ডাউনলোড করুন (যা এই বিভাগে উল্লেখ করা অন্যান্য ট্রেসগুলিও অন্তর্ভুক্ত করে), ফাইলটি আনজিপ করুন এবং আপনার ব্রাউজারে trace_30905547.html ফাইলটি খুলুন৷

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

যেহেতু আমরা ডিবাগ করতে ftrace ব্যবহার করতে পারিনি, তাই আমরা LOCK_STAT কাজ করতে পেরেছি তারপর অ্যাপ থেকে অন্যান্য সমস্ত ট্রেসিং বন্ধ করে দিয়েছি। ফলাফলগুলি দেখায় যে লক বিবাদটি আসলে ftrace থেকে ছিল কারণ ftrace চলমান না থাকাকালীন লক ট্রেসে কোনও বিরোধ দেখা যায়নি।


আপনি যদি কনফিগারেশন বিকল্পের সাথে একটি কার্নেল বুট করতে পারেন, তাহলে লক ট্রেসিং ftrace-এর অনুরূপ:

  1. ট্রেসিং সক্ষম করুন:
    echo 1 > /proc/sys/kernel/lock_stat
    
  2. আপনার পরীক্ষা চালান.
  3. ট্রেসিং অক্ষম করুন:
    echo 0 > /proc/sys/kernel/lock_stat
    
  4. আপনার ট্রেস ডাম্প করুন:
    cat /proc/lock_stat > /data/local/tmp/lock_stat
    

ফলাফলের আউটপুট ব্যাখ্যা করতে সাহায্যের জন্য, <kernel>/Documentation/locking/lockstat.txt এ lockstat ডকুমেন্টেশন পড়ুন।

বিক্রেতা ট্রেসপয়েন্ট ব্যবহার করুন

প্রথমে আপস্ট্রিম ট্রেসপয়েন্টগুলি ব্যবহার করুন, তবে কখনও কখনও আপনাকে বিক্রেতা ট্রেসপয়েন্টগুলি ব্যবহার করতে হবে:

  { "gfx",        "Graphics",         ATRACE_TAG_GRAPHICS, {
        { OPT,      "events/mdss/enable" },
        { OPT,      "events/sde/enable" },
        { OPT,      "events/mali_systrace/enable" },
    } },

HAL পরিষেবা দ্বারা ট্রেসপয়েন্টগুলি এক্সটেনসিবল যা আপনাকে ডিভাইসের নির্দিষ্ট ট্রেস পয়েন্ট/বিভাগ যোগ করতে দেয়। ট্রেসপয়েন্টগুলি পারফেটো, অ্যাট্রেস/সিস্ট্রেস এবং অন-ডিভাইস সিস্টেম ট্রেসিং অ্যাপের সাথে একত্রিত করা হয়েছে।

ট্রেসপয়েন্ট/বিভাগ বাস্তবায়নের জন্য APIগুলি হল:

  • listCategories() তৈরি করে (vec<TracingCategory> বিভাগ);
  • enableCategories(vec<string> categories) জেনারেট করে (স্থিতি অবস্থা);
  • disableAllCategories() জেনারেট করে (স্থিতি অবস্থা);
আরও তথ্যের জন্য, AOSP- তে HAL সংজ্ঞা এবং ডিফল্ট বাস্তবায়ন পড়ুন: