国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

php多進(jìn)程插入數(shù)據(jù)(pcntl 學(xué)習(xí)筆記二)

CoyPan / 701人閱讀

摘要:進(jìn)程切換太多,影響了了效率應(yīng)該是原因之一。當(dāng)時,十萬條記錄,個進(jìn)程插入總時間為單進(jìn)程插入萬條數(shù)據(jù),耗時秒,相對個進(jìn)程插入萬記錄來說,耗時少些。而單進(jìn)程插入萬條記錄,耗時,相對來說,是挺慢的了。

個人在虛擬機centos7,單核,1G內(nèi)存

/**
 * 模擬并發(fā)請求,10萬次寫入數(shù)據(jù)庫
 * 拆分為10個進(jìn)程,每個進(jìn)程處理一萬條插入
 */

$total = 10000;
$num   = 10;
$per   = $total/$num;

$sql  = "";
$child = "";

echo "start ".microtime(true).PHP_EOL;
for($i = 1; $i<= $num; $i++)
{
    $pid = pcntl_fork();
    if($pid == -1) {
        die("fork error");
    }
    if($pid > 0) {
        //$id = pcntl_wait($status,WNOHANG);
        $child[] = $pid;
    } else if ($pid == 0) {
        $link  = mysqli_connect("localhost","root","root","yii2advanced");
        $start = ($i-1)*$per + 1;
        $end   = $start + $per;
        for($j = $start; $j< $end; $j++){
            $time = microtime(true);
            $sql = "insert pcntl_test (rank,time) values (".$j.",".$time.")";
            mysqli_query($link,$sql);
        }
        mysqli_close($link);
        $id = getmypid();
        echo "child ".$id." finished ".microtime(true).PHP_EOL;
        exit(0);
    }
}

while(count($child)){
    foreach($child as $k => $pid) {
        $res = pcntl_waitpid($pid, $status, WNOHANG);
        if ( -1 == $res || $res > 0) {
            unset($child[$k]);
        }
    }
}
echo "end ".microtime(true).PHP_EOL;

當(dāng)$total=10000,$num = 10;執(zhí)行結(jié)果如下:

start 1491903371.5548
child 19860 finished 1491903417.2113
child 19857 finished 1491903417.6909
child 19864 finished 1491903417.7793
child 19855 finished 1491903417.8695
child 19859 finished 1491903417.9162
child 19861 finished 1491903418.0089
child 19856 finished 1491903418.0532
child 19863 finished 1491903418.0842
child 19862 finished 1491903418.1474
child 19858 finished 1491903418.4341
end 1491903418.4424
總時間為46.88759994506836秒

當(dāng)$total=10000,$num = 100時,執(zhí)行結(jié)果如下:

start 1491904334.1735
child 20085 finished 1491904337.0712
child 20086 finished 1491904337.144
……
child 20262 finished 1491904341.5602
child 20264 finished 1491904341.5803
end 1491904341.5869
總時間為7.413399934768677

當(dāng)$total=10000,$num = 1000時,執(zhí)行結(jié)果如下:

start 1491904562.0166
child 20282 finished 1491904562.1191
child 20277 finished 1491904562.1268
child 20279 finished 1491904562.1352
...
child 21586 finished 1491904576.6954
child 21582 finished 1491904576.7024
child 21584 finished 1491904576.7226
end 1491904576.7297
總時間為14.71310019493103,相比100個子進(jìn)程,耗時更長了。進(jìn)程切換太多,影響了了效率應(yīng)該是原因之一。

當(dāng)$total=100000 ,$num=100時,十萬條記錄,100個進(jìn)程插入

start 1491905670.2652
child 21647 finished 1491905725.4382
child 21651 finished 1491905725.4595
child 21642 finished 1491905725.5402
....
child 21810 finished 1491905729.7709
child 21812 finished 1491905729.8498
child 21811 finished 1491905729.9612
end 1491905729.9679
總時間為59.70270013809204

單進(jìn)程插入1萬條數(shù)據(jù),耗時18秒,相對10個進(jìn)程插入1萬記錄來說,耗時少些。
而單進(jìn)程插入10萬條記錄,耗時187.40066790581,相對來說,是挺慢的了。三分鐘。。。

不過,本人再fork 1000個進(jìn)程,來插入10萬記錄時,成功的情況下36秒左右,也可能會出現(xiàn)錯誤,mysqli_connection返回false,是不是連接數(shù)受限制了?

fork 一萬個子進(jìn)程,插入一百萬數(shù)據(jù),這時,出現(xiàn)連接錯的情況就很多了。最后耗時360秒,數(shù)據(jù)表中插入了945300條記錄,成功率94.53%。于是查看數(shù)據(jù)庫的相關(guān)配置信息

mysql>  show global status like "%connect%";
+-----------------------------------------------+---------------------+
| Variable_name                                 | Value               |
+-----------------------------------------------+---------------------+
| Aborted_connects                              | 0                   |
| Connection_errors_accept                      | 0                   |
| Connection_errors_internal                    | 0                   |
| Connection_errors_max_connections             | 628                 |
| Connection_errors_peer_address                | 0                   |
| Connection_errors_select                      | 0                   |
| Connection_errors_tcpwrap                     | 0                   |
| Connections                                   | 16519               |
| Locked_connects                               | 0                   |
| Max_used_connections                          | 501                 |
| Max_used_connections_time                     | 2017-04-12 15:19:54 |
| Performance_schema_session_connect_attrs_lost | 0                   |
| Ssl_client_connects                           | 0                   |
| Ssl_connect_renegotiates                      | 0                   |
| Ssl_finished_connects                         | 0                   |
| Threads_connected                             | 4                   |
+-----------------------------------------------+---------------------+


mysql>  show global variables like "%connect%";
+-----------------------------------------------+--------------------+
| Variable_name                                 | Value              |
+-----------------------------------------------+--------------------+
| character_set_connection                      | utf8mb4            |
| collation_connection                          | utf8mb4_general_ci |
| connect_timeout                               | 10                 |
| disconnect_on_expired_password                | ON                 |
| init_connect                                  |                    |
| max_connect_errors                            | 100                |
| max_connections                               | 500                |
| max_user_connections                          | 0                  |
| performance_schema_session_connect_attrs_size | 512                |
+-----------------------------------------------+--------------------+

修改 myqsql 配置文件,/etc/my.cnf
把max_connections 改為10000,然后重啟mysql
實際MySQL服務(wù)器允許的最大連接數(shù)16384;
結(jié)果然并卵,虛擬機好像掛了了。

并發(fā)量大的時候,問題就出在了連接mysql這里。
可以通過一個連接池來嘗試解決該問題。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/22694.html

相關(guān)文章

  • php創(chuàng)建恒定數(shù)量的進(jìn)程pcntl學(xué)習(xí)筆記三)

    摘要:最近在學(xué)習(xí)進(jìn)程相關(guān)的知識,配合實際編碼,覺得有點意思。閑話不說了,進(jìn)入正題,受網(wǎng)友啟發(fā),如何創(chuàng)建恒定數(shù)量的進(jìn)程呢有進(jìn)程掛了,就創(chuàng)建新的,進(jìn)程,進(jìn)程多了就殺掉幾個。 最近在學(xué)習(xí)進(jìn)程相關(guān)的知識,配合實際編碼,覺得有點意思。這段時間工作不忙,有時間自己研究進(jìn)步,感覺這才是真正的工作啊。相比上一家公司(壓抑的工作飽和度……)感覺開心很多。下一步再研究一下多線程??纯茨懿荒懿迦胍磺f條數(shù)據(jù)。閑話...

    hizengzeng 評論0 收藏0
  • PHP進(jìn)程系列筆記

    摘要:任何進(jìn)程在退出前使用退出都會變成僵尸進(jìn)程用于保存進(jìn)程的狀態(tài)等信息,然后由進(jìn)程接管。這時候就算手動結(jié)束腳本程序也無法關(guān)閉這個僵尸子進(jìn)程了。那么子進(jìn)程結(jié)束后,沒有回收,就產(chǎn)生僵尸進(jìn)程了。本小節(jié)我們通過安裝信號處理函數(shù)來解決僵尸進(jìn)程問題。 上一篇文章講解了pcntl_fork和pcntl_wait兩個函數(shù)的使用,本篇繼續(xù)講解PHP多進(jìn)程相關(guān)新知識。 僵尸(zombie)進(jìn)程 這里說下僵尸進(jìn)程...

    CatalpaFlat 評論0 收藏0
  • pcntl擴展學(xué)習(xí)筆記一(pcntl_fork與pcntl_wait,串行執(zhí)行分析)

    摘要:對編程的理解,應(yīng)該到深入到操作系統(tǒng)級別。進(jìn)程控制,我一直都沒有接觸,感覺好高端,今天啃了一下擴展的最簡單的兩個函數(shù),有點心得,記錄一下吧,歡迎拋磚。 對編程的理解,應(yīng)該到深入到操作系統(tǒng)級別。進(jìn)程控制,我一直都沒有接觸,感覺好高端,今天啃了一下pcntl擴展的最簡單的兩個函數(shù),有點心得,記錄一下吧,歡迎拋磚。新建代碼文件 pcntl_wait.php,如下: $i = 0; ...

    TesterHome 評論0 收藏0
  • PHP進(jìn)程系列筆記(一)

    摘要:用于創(chuàng)建子進(jìn)程。該函數(shù)阻塞當(dāng)前進(jìn)程,只到當(dāng)前進(jìn)程的一個子進(jìn)程退出或者收到一個結(jié)束當(dāng)前進(jìn)程的信號。注意處需要注意子進(jìn)程需要防止子進(jìn)程也進(jìn)入循環(huán)。如果沒有,最終創(chuàng)建的子進(jìn)程不只個。 本系列文章將向大家講解pcntl_*系列函數(shù),從而更深入的理解進(jìn)程相關(guān)知識。 PCNTL在PHP中進(jìn)程控制支持默認(rèn)是關(guān)閉的。您需要使用 --enable-pcntl 配置選項重新編譯PHP的 CGI或CLI版本...

    ddongjian0000 評論0 收藏0
  • PHP進(jìn)程系列筆記(五)

    摘要:消息隊列更常見的用途是主進(jìn)程分配任務(wù),子進(jìn)程消費執(zhí)行。子進(jìn)程前面加了個,這是為了防止父進(jìn)程還未往消息隊列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴展實現(xiàn)的多進(jìn)程程序。本節(jié)給大家介紹swoole擴展的swoole_process模塊。 swoole多進(jìn)程 swoole_process 是swoole提供的進(jìn)程管理模塊,用來替代PHP的pcntl擴展。 首先,確保安裝的swoole...

    qianfeng 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<