Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

आप अपने PHP/MySQL अनुप्रयोगों में मल्टीकोर सीपीयू का अच्छा उपयोग कैसे करते हैं?

परिचय

PHP में पूर्ण मल्टी-थ्रेडिंग है समर्थन जिसका आप इतने तरीकों से पूरा लाभ उठा सकते हैं। इस मल्टी-थ्रेडिंग क्षमता को विभिन्न उदाहरणों में प्रदर्शित करने में सक्षम हैं:

एक त्वरित खोज अतिरिक्त संसाधन देगा।

श्रेणियां

1:MySQL क्वेरीज़

MySQL पूरी तरह से है बहु-थ्रेडेड और कई सीपीयू का उपयोग करेगा, बशर्ते कि ऑपरेटिंग सिस्टम उनका समर्थन करता है, यह सिस्टम संसाधनों को भी अधिकतम करेगा यदि प्रदर्शन के लिए ठीक से कॉन्फ़िगर किया गया हो।

my.ini . में एक सामान्य सेटिंग जो थ्रेड प्रदर्शन को प्रभावित करता है वह है:

thread_cache_size = 8

thread_cache_size यदि आपके पास बहुत से नए कनेक्शन हैं, तो प्रदर्शन को बेहतर बनाने के लिए इसे बढ़ाया जा सकता है। आम तौर पर, यदि आपके पास अच्छा थ्रेड कार्यान्वयन है तो यह उल्लेखनीय प्रदर्शन सुधार प्रदान नहीं करता है। हालाँकि, यदि आपका सर्वर प्रति सेकंड सैकड़ों कनेक्शन देखता है, तो आपको सामान्य रूप से पर्याप्त थ्रेड_कैश_साइज़ सेट करना चाहिए ताकि अधिकांश नए कनेक्शन कैश्ड थ्रेड्स का उपयोग करें

अगर आप Solaris का उपयोग कर रहे हैं तो आप

. का उपयोग कर सकते हैं
thread_concurrency = 8 

thread_concurrency अनुप्रयोगों को थ्रेड सिस्टम को वांछित संख्या में थ्रेड्स के बारे में संकेत देने में सक्षम बनाता है जिन्हें एक ही समय में चलाया जाना चाहिए।

यह चर MySQL 5.6.1 के रूप में पदावनत है और MySQL 5.7 में हटा दिया गया है। जब भी आप इसे सोलारिस 8 या उससे पहले के लिए न देखें, तो आपको इसे MySQL कॉन्फ़िगरेशन फ़ाइलों से हटा देना चाहिए।

InnoDB: :

यदि आप का उपयोग कर रहे हैं तो आपकी ऐसी कोई सीमा नहीं है। इनोडब इसमें स्टोरेज इंजन है क्योंकि यह थ्रेड कंसीडर का पूरा समर्थन करता है

innodb_thread_concurrency //  Recommended 2 * CPUs + number of disks

आप innodb_read_io_threads . पर भी देख सकते हैं और innodb_write_io_threads जहां डिफ़ॉल्ट 4 . है और इसे 64 . तक बढ़ाया जा सकता है हार्डवेयर पर निर्भर करता है

अन्य:

देखने के लिए अन्य कॉन्फ़िगरेशन में key_buffer_size . शामिल हैं , table_open_cache , sort_buffer_size आदि। जिसके परिणामस्वरूप बेहतर प्रदर्शन होता है

PHP:

शुद्ध PHP में आप MySQL वर्कर बना सकते हैं जहाँ प्रत्येक क्वेरी को अलग PHP थ्रेड में निष्पादित किया जाता है

$sql = new SQLWorker($host, $user, $pass, $db);
$sql->start();

$sql->stack($q1 = new SQLQuery("One long Query")); 
$sql->stack($q2 = new SQLQuery("Another long Query"));

$q1->wait(); 
$q2->wait(); 

// Do Something Useful

यहां SQLWorker का पूरा काम करने का उदाहरण दिया गया है

2:HTML सामग्री पार्सिंग

यदि आप पहले से ही समस्या को जानते हैं तो यह ईवेंट लूप, जॉब क्यू या थ्रेड का उपयोग करके हल करना आसान बनाता है।

एक समय में एक दस्तावेज़ पर काम करना बहुत, बहुत . हो सकता है धीमी, दर्दनाक प्रक्रिया। @ka एक बार कई अनुरोधों को कॉल करने के लिए AJAX का उपयोग करके अपना रास्ता हैक कर लिया, कुछ रचनात्मक दिमाग pcntl_fork लेकिन अगर आप windows . का उपयोग कर रहे हैं तो आप pcntl का लाभ नहीं उठा सकते

pThreads . के साथ विंडोज़ और यूनिक्स सिस्टम दोनों का समर्थन करते हुए, आपके पास ऐसी कोई सीमा नहीं है। जितना आसान है .. यदि आपको 100 दस्तावेज़ों को पार्स करने की आवश्यकता है? स्पॉन 100 थ्रेड ... सरल

एचटीएमएल स्कैनिंग

// Scan my System
$dir = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
$dir = new RecursiveIteratorIterator($dir);

// Allowed Extension
$ext = array(
        "html",
        "htm"
);

// Threads Array
$ts = array();

// Simple Storage
$s = new Sink();

// Start Timer
$time = microtime(true);

$count = 0;
// Parse All HTML
foreach($dir as $html) {
    if ($html->isFile() && in_array($html->getExtension(), $ext)) {
        $count ++;
        $ts[] = new LinkParser("$html", $s);
    }
}

// Wait for all Threads to finish
foreach($ts as $t) {
    $t->join();
}

// Put The Output
printf("Total Files:\t\t%s \n", number_format($count, 0));
printf("Total Links:\t\t%s \n", number_format($t = count($s), 0));
printf("Finished:\t\t%0.4f sec \n", $tm = microtime(true) - $time);
printf("AvgSpeed:\t\t%0.4f sec per file\n", $tm / $t);
printf("File P/S:\t\t%d file per sec\n", $count / $tm);
printf("Link P/S:\t\t%d links per sec\n", $t / $tm);

आउटपुट

Total Files:            8,714
Total Links:            105,109
Finished:               108.3460 sec
AvgSpeed:               0.0010 sec per file
File P/S:               80 file per sec
Link P/S:               907 links per sec

प्रयुक्त वर्ग

Sink

class Sink extends Stackable {
    public function run() {
    }
}

LinkParser

class LinkParser extends Thread {

    public function __construct($file, $sink) {
        $this->file = $file;
        $this->sink = $sink;
        $this->start();
    }

    public function run() {
        $dom = new DOMDocument();
        @$dom->loadHTML(file_get_contents($this->file));
        foreach($dom->getElementsByTagName('a') as $links) {
            $this->sink[] = $links->getAttribute('href');
        }
    }
}

प्रयोग

8,714 को पार्स करने की कोशिश की जा रही है फ़ाइलें जिनमें 105,109 . है धागे के बिना लिंक और देखें कि इसमें कितना समय लगेगा।

बेहतर वास्तुकला

बहुत सारे धागों को पैदा करना जो उत्पादन में करना कोई चतुर बात नहीं है। पूलिंग का उपयोग करना एक बेहतर तरीका होगा। . परिभाषित करने का एक पूल रखें कार्यकर्ता फिर ढेर Task . के साथ

प्रदर्शन सुधार

ठीक है, ऊपर दिए गए उदाहरण में अभी भी सुधार किया जा सकता है। एक ही थ्रेड में सभी फाइलों को स्कैन करने के लिए सिस्टम की प्रतीक्षा करने के बजाय आप फाइलों के लिए मेरे सिस्टम को स्कैन करने के लिए कई थ्रेड्स का उपयोग कर सकते हैं, फिर डेटा को प्रोसेसिंग के लिए वर्कर्स को स्टैक कर सकते हैं

3:सर्च इंडेक्स अपडेट हो रहा है

पहले उत्तर से इसका बहुत अधिक उत्तर दिया गया है, लेकिन प्रदर्शन में सुधार के लिए बहुत सारे तरीके हैं। क्या आपने कभी घटना आधारित दृष्टिकोण पर विचार किया है?

पेश है इवेंट

@rdlowrey उद्धरण 1:

@rdlowrey उद्धरण 2:

आप event-driven के साथ प्रयोग क्यों नहीं करते? , non-blocking I/O आपकी समस्या के प्रति दृष्टिकोण। PHP में libevent है अपने आवेदन को सुपरचार्ज करने के लिए।

मुझे पता है कि यह प्रश्न सभी Multi-Threading का है लेकिन अगर आपके पास कुछ समय हो तो आप इसे PHP में लिखा हुआ न्यूक्लियर रिएक्टर देख सकते हैं। द्वारा @igorw

आखिरकार

विचार

मुझे लगता है कि आपको Cache का उपयोग करने पर विचार करना चाहिए और Job Queue आपके कुछ कार्यों के लिए। आप आसानी से एक संदेश कह सकते हैं

Document uploaded for processing ..... 5% - Done   

फिर बैकग्राउंड में सारा समय बर्बाद करने वाले टास्क करें। कृपया देखें एक बड़े प्रसंस्करण कार्य को छोटा बनाना इसी तरह के केस स्टडी के लिए।

प्रोफाइलिंग

प्रोफाइलिंग टूल? वेब एप्लिकेशन के लिए Xdebug से कोई एकल प्रोफ़ाइल टूल नहीं है। से Yslow सभी बहुत उपयोगी हैं। उदा. जब थ्रेड की बात आती है तो Xdebug उपयोगी नहीं है क्योंकि यह समर्थित नहीं है

मेरा कोई पसंदीदा नहीं है



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. दो तिथियों के बीच MySQL सप्ताह की गणना

  2. #1222 - इस्तेमाल किए गए सेलेक्ट स्टेटमेंट में कॉलम की संख्या अलग-अलग होती है

  3. MySQL कमांड:सामान्य MySQL प्रश्नों की चीट शीट

  4. MONTHNAME () उदाहरण – MySQL

  5. एक्सेस फॉर्म कैस्केडिंग कॉम्बो बॉक्स ड्रॉप डाउन मेनू में कुछ भी नहीं दिखाता है