আমি কীভাবে দ্রুপালের নোড_সেভ () ফাংশনটি গতি বাড়িয়ে তুলতে পারি?


9

নোড_স্যাভ () এর অদক্ষতা নিয়ে আমার অনেক সমস্যা হচ্ছে। তবে নোড কি আমার সমস্যা বাঁচায়? এটিই আমি শেষ পর্যন্ত অনুসন্ধান করার চেষ্টা করছি।

আমি 100,000 পুনরাবৃত্তি সহ একটি লুপ তৈরি করেছি। নোড অবজেক্টটি বৈধ হওয়ার জন্য এবং সঠিকভাবে সংরক্ষণ করার জন্য আমি বেয়ার ন্যূনতম তৈরি করেছি। এখানে নোড সেভ কোড:

$node = new stdClass();
        $node->type = "test_page";

        node_object_prepare($node);

        $node->uid = 1;
        $node->title = $node_title;
        $node->status = 1;
        $node->language = LANGUAGE_NONE;
        if($node = node_submit($node)){
            node_save($node);
}

ফলাফল এখানে:

100,000 নোড সংরক্ষণ করা হয়েছিল, প্রতিটি নোড_সেস () ব্যবহার করে। এটি সম্পূর্ণ হতে 5196.22 সেকেন্ড সময় নিয়েছে। এটি কেবলমাত্র 19 টি একটি সেকেন্ড সঞ্চয় করে।

মোটামুটি বলতে গেলে এটি গ্রহণযোগ্য নয়, বিশেষত যখন এই ব্যক্তি প্রতি সেকেন্ডে প্রায় 1200 স্বতন্ত্র সন্নিবেশ অনুসন্ধানগুলি পাচ্ছেন এবং এই ব্যক্তি প্রতি সেকেন্ডে 25,000 সন্নিবেশ পাচ্ছেন

তো, এখানে কি চলছে? বাধা কোথায়? এটি কি নোড_সেভ () ফাংশন সহ এবং এটি কীভাবে ডিজাইন করা হয়েছে?

এটা কি আমার হার্ডওয়্যার হতে পারে? আমার হার্ডওয়্যার একটি ডেভলপমেন্ট সার্ভার, এটি ছাড়া আমার ব্যতীত আর কেউ নেই - ইন্টেল ডুয়াল কোর, 3 জিএইচজেড, উবুন্টু 12.04 16 গিগ র্যাম সহ।

যখন লুপটি চালিত হয় আমার সংস্থান ব্যবহারগুলি: মাইএসকিউএল 27% সিপিইউ, 6 এম র‌্যাম; পিএইচপি 22% সিপিইউ 2 এম র‌্যাম।

আমার মাইএসকিএল কনফিগারেশনটি পেরকোনা উইজার্ড দ্বারা সম্পন্ন হয়েছিল ।

মাইএসকিএল বলেছে যে আমার সিপিইউ ব্যবহার যদি 70% এর নিচে হয় তবে আমার সমস্যাটি ডিস্কের সাথে সীমাবদ্ধ । মঞ্জুর, আমার কাছে কেবল মিল ডাব্লুডি ক্যাভিয়ার 7200 আরপিএম আছে, তবে আমার 19 টিরও বেশি সেকেন্ড পাওয়া উচিত এটির সাথে আমি আশা করি!

খুব বেশি দিন আগে আমি একদিনে 30,000 নোড সংরক্ষণ করার বিষয়ে লিখেছিলাম । তবে, স্পষ্ট করে বলতে গেলে, এই নোডের কোনও বাহ্যিক শক্তির সাথে কোনও সম্পর্ক নেই। নোড_সেভ () এ কল করার গতি কীভাবে বাড়ানো যায় সে সম্পর্কে শিখতে নিখুঁতভাবে এটি একটি মানদণ্ড।

বাস্তবিকভাবে, আমার নোড_সেভ ব্যবহার করে প্রতি মিনিটে 30,000 আইটেমটি ডাটাবেসে পাওয়া দরকার। নোড সেভ যদি কোনও বিকল্প না হয় তবে আমি অবাক হয়েছি যে আমি নিজের ড্রুপাল এপিআই ফাংশন "নোড_ব্যাচ_স্যাভ ()" বা এমন কিছু লিখতে পারি যা INSERT ক্যোয়ারির সাথে বাল্ক সন্নিবেশগুলি করার জন্য মাইএসকিএল-এর ক্ষমতা গ্রহণ করে । কিভাবে এই সম্পর্কে চিন্তাভাবনা?


2
কাঁচা sertোকানো কর্মক্ষমতা এবং নোড_সেভ কী করবে তার মধ্যে একটি বড় পার্থক্য রয়েছে। একটি জিনিসের জন্য নোড_সেজ একটি লেখা এবং লেখার একটি সিরিজ সম্পাদন করে। তবে বেশি তথ্য ছাড়াই সম্ভাব্য বাধা এবং অপ্টিমাইজেশন নিয়ে আলোচনা করার কোনও মানে নেই।
আলফ্রেড আর্মস্ট্রং

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

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

@ অ্যালফ্রেডআর্মস্ট্রং আমি অন্য ডেটাবেজে থাকা ডেটা ভিত্তিক নোড তৈরি করছি। আমি সঠিক দ্রুপাল কন্টেন্টের ধরণের উপরে ডেটাটি ছাঁচ করি এবং এটিকে নোড_সেভ করি। আমার ক্লায়েন্টরা মূলত ইউনিভার্সিটি যা ড্রুপলে যেতে চায়। তাদের জন্য 200,000 থেকে 1,000,000 নোড (বিভাগগুলির সাইটের বিষয়বস্তু, শিক্ষার্থী এবং অনুষদের রেকর্ড ইত্যাদি) থাকা কোনও অস্বাভাবিক বিষয় নয় যা তারা ওয়েব সলিউশনে নিজস্ব ব্যবহারের এক দশক পরে মাইগ্রেশন করতে চান। আমি এটি পড়ি, যা উত্সাহজনক, তবে এখনও পছন্দসই পদ্ধতির চেয়ে কম। evolvingweb.ca/story/…
blue928

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

উত্তর:


10

আপনি নোড_সেভ ব্যবহার করে এক মিনিটে 30 000 সন্নিবেশ পাবেন না। কোনভাবেই না.

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

  public function processImport(array $options = array()) {
    parent::processImport($options = array());
    // Do not force menu rebuilding. Otherwise pathauto will try to rebuild
    // in each node_save() invocation.
    variable_set('menu_rebuild_needed', FALSE);
  }

অন্যদিকে, আপনি যদি কোনও কাস্টম সেভ ফাংশন লিখেন যা কোনও হুককে না ডাকে, সিস্টেমের দ্বারা অপ্রত্যাশিত এমন পরিস্থিতিতে আপনার অসঙ্গতিপূর্ণ ডেটা পাওয়ার ঝুঁকির মধ্যে রয়েছে। আমি কখনই এটি করার সুপারিশ করব না। এক্সএইচপ্রুফ ফায়ার করুন এবং দেখুন কি হচ্ছে।


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

আমি যে সমস্ত মাইগ্রেশন মডিউলগুলি পেয়েছি সেগুলি নোড_সেভ ব্যবহার করে।
আলফ্রেড আর্মস্ট্রং

1
@ নীল 928 তিনি বলছেন যে তিনি ব্যবহার করেনnode_save() তবে কিছু সমস্যা যুক্ত সমস্যাগুলি কমাতে কিছু কোড যুক্ত করেছেন, যেমন পাঠাটো প্রতিটি নোড সংরক্ষণের পরে মেনু ক্যাশে পুনর্নির্মাণের মতো
ক্লাইভ

আহ, ঠিক আছে, আমি দেখছি বোজান আপনার কোডটি কোনও মডিউল বা অনলাইনে উপলব্ধ যেখানে আমি দেখতে পেলাম যে আপনি পথের অটোয়ের মতো বাধা নিয়ে কীভাবে আচরণ করেছেন? এক্সএইচআরফের সাথে ভাল ধারণা। আমি এটি যাচাই করব।
নীল 928

5

সবার আগে, XCache / APC ইনস্টল করুন (পিএইচপি <5.5 এর জন্য) এবং দ্রুপালের জন্য মেমচেড কনফিগার করুন।

তারপরে আপনি মাইএসকিএলটিউনার স্ক্রিপ্ট ব্যবহার করে এখানে ভারী প্রশ্নের জন্য আপনার মাইএসকিউএল কনফিগারেশনটি অনুকূল করতে পারেন: http://mysqltuner.pl

যেমন

# performance tweaks (adjusted based on mysqltuner.pl)
query_cache_size = 32M
query_cache_limit = 256M
join_buffer_size = 32M
key_buffer = 8M
max_allowed_packet = 32M
table_cache = 512
sort_buffer_size = 1M
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 1M
myisam_sort_buffer_size = 8M

# When making adjustments, make tmp_table_size/max_heap_table_size equal
tmp_table_size = 16M
max_heap_table_size = 16M

thread_cache_size = 4

অন্যান্য পরামর্শ:

  • আপনার প্রয়োজন নেই এমন মডিউলগুলি অক্ষম করুন (যেমন ডেল , কোর ডেটাবেস লগিং মডিউল ইত্যাদি),
  • আপনার পিএইচপি সর্বশেষ বা উচ্চতর শাখায় আপগ্রেড করুন,
  • আপনার সিপিইউর উপর নির্ভর করে আপনার পিএইচপি 64৪-বিট বা উচ্চতর আর্কিটেকচারের জন্য পুনরায় রচনা করুন,
  • আপনার ডিবি ফাইল বা পুরো এলএএমপি পরিবেশের জন্য দ্রুত স্টোরেজ ডিভাইস ব্যবহার করুন (যেমন এসএসডি বা মেমরি-ভিত্তিক ফাইল সিস্টেম ),
  • পিএইচপি ডিবাগার বা প্রোফাইলার ব্যবহার কোন কর্মক্ষমতা বোতলের (যেমন খুঁজে বের করতে XDebug প্রোফাইলার , DTrace বা NuSphere PhpED পিএইচপি প্রোফাইলার ),
  • gprof প্রোফাইলিং সরঞ্জামের অধীনে কিছু সময়সাপেক্ষ ড্রাশ কমান্ড চালান , যাতে আপনি কিছু পারফরম্যান্স বাধাও পেতে পারেন

1
মাইএসকিউএল টিউন করা মনে হচ্ছে একটি বড় পার্থক্য রয়েছে। আমি mysqltuner.pl দ্বারা প্রদত্ত টিপস অনুসরণ করে এক মিনিটে প্রায় 80 টি নোড_সভেস থেকে প্রায় 700 হয়ে গেলাম।
জন ম্যাককালাম

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