मैं ड्रुपल के नोड_सेवे () फ़ंक्शन को कैसे तेज कर सकता हूं?


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 नोड्स को बचाया गया था, प्रत्येक में node_save () का उपयोग किया गया था। इसे पूरा करने में 5196.22 सेकंड का समय लगा। यह केवल 19 एक सेकंड बचाता है।

कम से कम कहने के लिए, यह स्वीकार्य नहीं है, खासकर जब यह व्यक्ति प्रति सेकंड लगभग 1200 व्यक्तिगत सम्मिलित प्रश्न प्राप्त कर रहा है , और इस व्यक्ति को प्रति सेकंड 25,000 आवेषण मिल रहे हैं

तो, यहाँ क्या हो रहा है? अड़चन कहां है? क्या यह नोड_सेवे () फ़ंक्शन के साथ है और इसे कैसे डिज़ाइन किया गया है?

क्या यह मेरा हार्डवेयर हो सकता है? मेरा हार्डवेयर एक विकास सर्वर है, इस पर मेरे अलावा कोई नहीं - इंटेल डुअल कोर, 3Ghz, उबंटू 12.04 विथ 16 गिग्स ऑफ रैम।

जबकि लूप मेरा संसाधन उपयोग चलाता है: MySQL 27% CPU, 6M RAM; PHP 22% CPU 2M RAM।

मेरा mysql विन्यास percona विज़ार्ड द्वारा किया गया था ।

माईसिकल का कहना है कि यदि मेरे सीपीयू का उपयोग 70% से कम है तो मेरी समस्या डिस्क बाउंड है । दी, मेरे पास केवल मिल की एक रन डब्लूडी कैवियार 7200 आरपीएम है, लेकिन मुझे इसके साथ 19 से अधिक इंसर्ट मिल रहे हैं, मुझे उम्मीद है!

बहुत पहले नहीं मैंने एक दिन में 30,000 नोड बचाने के बारे में लिखा था । हालांकि, स्पष्ट होने के लिए, इस नोड का किसी भी बाहरी ताकतों से कोई लेना-देना नहीं है। यह विशुद्ध रूप से एक बेंचमार्क है कि कैसे नोड_सेवे () को कॉल की गति को बढ़ाया जाए।

वास्तविक रूप से, मुझे नोड_सेवे का उपयोग करके हर मिनट डेटाबेस में 30,000 आइटम प्राप्त करने की आवश्यकता है। अगर नोड सेव एक विकल्प नहीं है, तो मुझे आश्चर्य होता है कि क्या मैं अपना ड्रूपल एपि फंक्शन "नोड_बैच_सैव ()" या ऐसा कुछ लिख सकता हूं, जो INSERT क्वेरी के साथ थोक आवेषण करने की mysql की क्षमता का लाभ उठाता है । कैसे इस दृष्टिकोण के लिए विचार?


2
कच्चे डालने के प्रदर्शन और क्या नोड_सैव के बीच एक बड़ा अंतर है। एक चीज के लिए नोड_सेवे रीड और राइट की एक श्रृंखला करता है। लेकिन अधिक डेटा के बिना संभावित अड़चनों और अनुकूलन पर चर्चा करने का कोई मतलब नहीं है।
अल्फ्रेड आर्मस्ट्रांग

आपको यह विचार करने की आवश्यकता है कि आप अपने उद्देश्यों के लिए इस तरह से ड्रुपल का उपयोग क्यों कर रहे हैं। यदि आप बस एक सपाट तालिका में बहुत सारे डेटा को कैप्चर करना चाहते हैं और इसे Drupal का उपयोग करके प्रदर्शित करना चाहते हैं, तो आप Drupal को पूरी तरह से बायपास कर सकते हैं और इसे लिखते समय डेटा का उपयोग करने के लिए एक कस्टम मॉड्यूल का उपयोग कर सकते हैं
अल्फ्रेड आर्मस्ट्रांग

मुझे संदेह है कि बोतल की गर्दन डेटाबेस की तरफ है। नोड सेव बैकग्राउंड में बहुत सारी चीजें करता है: यह कई हुक (हुक_नोड_प्रसेव, हुक_एंटिटी_प्रसेव, हुक_नोड_इन्टर, हुक_वेंटी_इन्टर इत्यादि) को आमंत्रित करेगा, जिनमें से प्रत्येक किसी भी संख्या में मॉड्यूल कह सकता है। इसके अलावा node_save उस नोड के लिए अनुमतियों का पुनर्निर्माण करेगा और यह उस नोड के लिए कैश को साफ कर देगा ...
ऐलिस हीटन

@AlfredArmstrong मैं एक अन्य डेटाबेस में मौजूद डेटा पर आधारित नोड बना रहा हूं। मैं डेटा को सही ड्रूपल कंटेंट टाइप और नोड_सेवे में ढालता हूं। मेरे ग्राहक मुख्य रूप से विश्वविद्यालय हैं जो ड्रुपल पर स्विच करना चाहते हैं। यह उनके लिए असामान्य नहीं है कि उनके पास 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);
  }

दूसरी ओर, यदि आप एक कस्टम सेव फंक्शन लिखते हैं, जो बिना किसी हुक के चालान करता है, तो आपको सिस्टम द्वारा अनपेक्षित स्थिति में असंगत डेटा प्राप्त करने का स्पष्ट खतरा है। मैं ऐसा करने की सलाह कभी नहीं दूंगा। आग xhprof और देखो क्या हो रहा है।


माइग्रेशन मॉड्यूल में से कुछ वहाँ हैं, वे थोक बचत नोड्स को कैसे समाप्त करते हैं? मेरा मतलब है, यह सब के अंत में, यह सब एक INSERT बयान के लिए उबलता है, है ना? नोड सेव का उपयोग न करने पर भी आपका माइग्रेशन वर्ग अंततः 'स्रोत' से 'लक्ष्य' में कैसे जुड़ता है लेकिन अभी भी तालिकाओं में डेटा अखंडता बनाए रखने की आवश्यकता है?
ब्लू 928

सभी माइग्रेशन मॉड्यूल जो मैं भर में आए हैं, एक नोड_सेवे का उपयोग करते हैं।
अल्फ्रेड आर्मस्ट्रांग

1
@ blue928 वह कह रहा है वह करता है उपयोग node_save(), लेकिन बचाने प्रत्येक नोड के बाद ज्ञात समस्याएँ कारण हो सकता है, Pathauto की तरह कम करने के लिए मेनू कैश के पुनर्निर्माण कुछ कोड कहते हैं
क्लाइव

आह, ठीक है, मैं देखता हूं। Bojan आपका कोड एक मॉड्यूल या ऑनलाइन में उपलब्ध है जहाँ मैं देख सकता हूँ कि आपने पथ ऑटो जैसे बाधाओं से कैसे निपटा है? Xhprof के साथ अच्छा विचार है। मैं उसमें जांच करूंगा।
ब्लू 928

5

सबसे पहले, XCache / APC (PHP <5.5 के लिए) स्थापित करें और Drupal के लिए मेमेकैड को कॉन्फ़िगर करें।

तो आप पर उपलब्ध mysqltuner स्क्रिप्ट का उपयोग करके भारी प्रश्नों के लिए अपने MySQL कॉन्फ़िगरेशन को अनुकूलित कर सकते हैं: 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

अन्य सुझाव:

  • उन मॉड्यूल को अक्षम करें जिनकी आपको आवश्यकता नहीं है (उदाहरण के लिए डेवेल , कोर डेटाबेस लॉगिंग मॉड्यूल, आदि),
  • अपने PHP को नवीनतम या उच्चतर शाखा में अपग्रेड करें,
  • अपने CPU के आधार पर 64-बिट या उच्चतर आर्किटेक्चर के लिए अपने PHP को फिर से खोलें।
  • अपनी db फ़ाइलों या पूरे LAMP वातावरण (जैसे SSD या मेमोरी-आधारित फ़ाइल सिस्टम ) के लिए तेज़ संग्रहण डिवाइस का उपयोग करें
  • किसी भी प्रदर्शन अड़चन का पता लगाने के लिए PHP डिबगर या प्रोफाइलर का उपयोग करें (जैसे XDebug Profiler , DTrace या NuSphere PhpED PHP Profiler )
  • के तहत कुछ समय लेने वाली Drush आदेश चला gprof , रूपरेखा उपकरण ताकि आप कुछ प्रदर्शन टोंटी के साथ-साथ प्राप्त कर सकते हैं

1
ट्यूनिंग MySQL के लिए एक बड़ा अंतर लगता है। मैं mysqltuner.pl द्वारा दिए गए सुझावों का पालन करके लगभग went० नोड_सेवे से लगभग node०० तक चला गया।
जॉन मैककॉलम

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.