Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để bạn sử dụng tốt các CPU đa lõi trong các ứng dụng PHP / MySQL của mình?

Giới thiệu

PHP có đầy đủ Đa luồng hỗ trợ mà bạn có thể tận dụng tối đa theo nhiều cách. Đã có thể chứng minh khả năng Đa luồng này trong các ví dụ khác nhau:

Tìm kiếm nhanh sẽ cung cấp thêm tài nguyên.

Danh mục

1:Truy vấn MySQL

MySQL hoàn toàn đa luồng và sẽ sử dụng nhiều CPU, miễn là hệ điều hành hỗ trợ chúng, Nó cũng sẽ tối đa hóa tài nguyên hệ thống nếu được định cấu hình đúng cho hiệu suất.

Một cài đặt điển hình trong my.ini ảnh hưởng đến hiệu suất luồng là:

thread_cache_size = 8

thread_cache_size có thể được tăng lên để cải thiện hiệu suất nếu bạn có nhiều kết nối mới. Thông thường, điều này không cung cấp một sự cải thiện hiệu suất đáng chú ý nếu bạn có một triển khai luồng tốt. Tuy nhiên, nếu máy chủ của bạn thấy hàng trăm kết nối mỗi giây, bạn thường nên đặt thread_cache_size đủ cao để hầu hết các kết nối mới sử dụng các chuỗi được lưu trong bộ nhớ cache

Nếu bạn đang sử dụng Solaris thì bạn có thể sử dụng

thread_concurrency = 8 

thread_concurrency cho phép các ứng dụng cung cấp cho hệ thống luồng một gợi ý về số luồng mong muốn sẽ được chạy cùng một lúc.

Biến này không được chấp nhận kể từ MySQL 5.6.1 và bị loại bỏ trong MySQL 5.7. Bạn nên xóa phần này khỏi các tệp cấu hình MySQL bất cứ khi nào bạn nhìn thấy nó trừ khi chúng dành cho Solaris 8 hoặc phiên bản cũ hơn.

InnoDB: :

Bạn sẽ không gặp phải những giới hạn như vậy nếu đang sử dụng Innodb có công cụ lưu trữ vì nó hỗ trợ đầy đủ đồng thời chuỗi

innodb_thread_concurrency //  Recommended 2 * CPUs + number of disks

Bạn cũng có thể xem tại innodb_read_io_threadsinnodb_write_io_threads trong đó mặc định là 4 và nó có thể được tăng lên cao đến 64 tùy thuộc vào phần cứng

Khác:

Các cấu hình khác cũng cần xem xét bao gồm key_buffer_size , table_open_cache , sort_buffer_size v.v ... tất cả đều dẫn đến hiệu suất tốt hơn

PHP:

Trong PHP thuần túy, bạn có thể tạo MySQL Worker nơi mỗi truy vấn được thực thi trong các chuỗi PHP riêng biệt

$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

Đây là Ví dụ làm việc đầy đủ của SQLWorker

2:Phân tích cú pháp nội dung HTML

Nếu bạn đã biết vấn đề thì bạn có thể giải quyết dễ dàng hơn thông qua các vòng lặp sự kiện, Hàng đợi Công việc hoặc sử dụng Luồng.

Làm việc trên từng tài liệu một có thể rất rất quá trình chậm chạp, đau đớn. @ka từng bị hack bằng cách sử dụng ajax để gọi nhiều yêu cầu, Một số bộ óc Sáng tạo sẽ chỉ phân nhánh quy trình bằng cách sử dụng pcntl_fork nhưng nếu bạn đang sử dụng windows thì bạn không thể tận dụng pcntl

Với pThreads hỗ trợ cả hệ thống windows và Unix, Bạn không có giới hạn như vậy. Có dễ dàng như .. Nếu bạn cần phân tích cú pháp 100 tài liệu? Sinh ra 100 chủ đề ... Đơn giản

Quét HTML

// 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);

Đầu ra

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

Lớp được sử dụng

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');
        }
    }
}

Thử nghiệm

Đang thử phân tích cú pháp 8,714 tệp có 105,109 liên kết không có chuỗi và xem nó sẽ mất bao lâu.

Kiến trúc tốt hơn

Tạo ra quá nhiều chủ đề không phải là một điều thông minh trong sản xuất. Cách tiếp cận tốt hơn sẽ là sử dụng Tổng hợp . Có một nhóm xác định Công nhân thì ngăn xếp với Task

Cải thiện hiệu suất

Tốt thôi, ví dụ trên vẫn có thể được cải thiện. Thay vì đợi hệ thống quét tất cả các tệp trong một luồng duy nhất, bạn có thể sử dụng nhiều luồng để quét hệ thống của tôi để tìm tệp sau đó xếp dữ liệu cho Nhân viên để xử lý

3:Cập nhật chỉ mục tìm kiếm

Điều này đã được giải đáp khá nhiều trong câu trả lời đầu tiên, nhưng có rất nhiều cách để cải thiện hiệu suất. Bạn đã bao giờ xem xét cách tiếp cận dựa trên Sự kiện chưa?

Sự kiện giới thiệu

@rdlowrey Trích dẫn 1:

@rdlowrey Trích dẫn 2:

Tại sao bạn không thử nghiệm với event-driven , non-blocking I/O cách tiếp cận vấn đề của bạn. PHP có giải phóng để tăng phí ứng dụng của bạn.

Tôi biết câu hỏi này là tất cả Multi-Threading nhưng nếu có thời gian, bạn có thể xem Lò phản ứng hạt nhân được viết bằng PHP này bởi @igorw

Cuối cùng

Cân nhắc

Tôi nghĩ bạn nên cân nhắc sử dụng CacheJob Queue cho một số nhiệm vụ của bạn. Bạn có thể dễ dàng nhận được một thông báo nói rằng

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

Sau đó, thực hiện tất cả các nhiệm vụ lãng phí thời gian trong nền. Vui lòng xem Thu nhỏ công việc xử lý lớn hơn cho một nghiên cứu điển hình tương tự.

Hồ sơ

Công cụ lập hồ sơ? Không có công cụ hồ sơ đơn lẻ nào cho ứng dụng web từ Xdebug tới Yslow đều rất hữu ích. Ví dụ. Xdebug không hữu ích khi nói đến chuỗi vì nó không được hỗ trợ

Tôi không có mục yêu thích



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ý nghĩa của id =LAST_INSERT_ID (id)

  2. Làm thế nào để thực thi nhiều truy vấn SQL trong MySQL Workbench?

  3. Khi nào thì Class.forName cần thiết khi kết nối với cơ sở dữ liệu qua JDBC trong một ứng dụng web?

  4. Xóa các từ trùng lặp khỏi trường trong mysql

  5. Tạo GUID trong MySQL cho Dữ liệu hiện có?