第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 MySQL+PHP+nginx 并行化請求?

如何使用 MySQL+PHP+nginx 并行化請求?

PHP
桃花長相依 2022-07-22 18:37:44
最近的發(fā)現(xiàn)在我嘗試過的所有其他事情中,我用自定義 JavaScript 替換了我的 JMeter 配置文件,該 JavaScript 在無限循環(huán)中依次訪問我的每個 API 端點,然后在不同的瀏覽器(一個 Firefox、一個 Chrome、一個 Safari)中并行運行這個腳本 -嘗試排除與來自同一來源的所有連接相關的問題(相同的用戶代理、相同的 cookie、相同的會話 ID 等)當我這樣做時,我注意到我所有的問題都消失了。查詢并行運行,應用程序的響應速度比 JMeter 讓您相信的要快得多在我看來,JMeter 將序列化請求似乎是不可能的,因為它是負載測試的事實上的標準。所以我開始嘗試重現(xiàn)這種行為為了重新創(chuàng)建 JMeter,我創(chuàng)建了以下兩個 PHP 腳本,它們(希望)模擬了我的 Yii 應用程序:慢.php<?phpsession_start();$_SESSION['some'] = 'value';// Yii is calling session_write_close() almost immediately after// the session is initialized, but to try and exacerbate issues,// I've commented it out:// session_write_close();$dsn = "mysql:host=localhost;dbname=platypus;unix_socket=/tmp/mysql.sock";$pdo = new PDO($dsn, "user", "password");// Yii was using whatever the default persistence behavior was,// but to try and exacerbate issues I set this flag:$pdo->setAttribute(PDO::ATTR_PERSISTENT, true);// Simulate a query running for 1 second by issuing a 1-second sleep$pdo->query("DO SLEEP(1)");echo "Done";快速.php<?phpsession_start();$_SESSION['some'] = 'value';$dsn = "mysql:host=localhost;dbname=platypus;unix_socket=/tmp/mysql.sock";$pdo = new PDO($dsn, "user", "password");$pdo->setAttribute(PDO::ATTR_PERSISTENT, true);// Simulate a query running for 0.1 seconds$pdo->query("DO SLEEP(0.1)");echo "Done";針對這兩個新端點運行 JMeter,沒有請求序列化。一切都是并行的。即使我擴展到 3、4 和 5 個線程,fast.php 總是在 100-150 毫秒內(nèi)返回,而 slow.php 總是在 1000-1050 毫秒內(nèi)返回。我能夠看到事情在 11 個線程崩潰,但那是因為我超過了 PHP 中的工作線程數(shù)所以總結(jié)一下:該問題僅在使用 JMeter 分析我的 API 時出現(xiàn),并且不是應用程序本身固有的這個問題不僅僅是一個 JMeter 錯誤,而是與我的應用程序或 Yii 1.1 相關聯(lián)我試過但無法提出最低限度的復制案例盡管在使用其他工具進行分析時不存在該問題,但很多人做出了回應并提供了很多有用的信息:避免 PHP 中的持久連接(可能導致多個請求共享一個連接,可能不會)session_write_close()通過盡早調(diào)用來避免會話鎖定確保您有足夠的 PHP 工作線程來處理同時連接的數(shù)量MySQL 完全支持并行請求(如果硬件可以處理的話)警惕表鎖定(任何帶有UPDATE語句的事務都可能鎖定表)MyISAM 執(zhí)行表級鎖定而不是行級鎖定
查看完整描述

4 回答

?
阿晨1998

TA貢獻2037條經(jīng)驗 獲得超6個贊

MySQL + PHP + Apache“一直”非常擅長“并行”運行單獨的 SQL 語句。如果單獨的用戶發(fā)出 HTTP 請求,他們自然會快速通過 Apache(可能是按順序,但很快)并到達單獨的 PHP 實例(假設 Apache 已經(jīng)配置了足夠的“孩子”)。每個 PHP 腳本都會建立自己的 MySQL 連接。MySQL 將很快接受多個連接(假設max_connections足夠高,默認情況下)。每個 MySQL 連接都將獨立工作(使用低級數(shù)據(jù)庫鎖、互斥鎖等)。每個都將在完成時完成,對于 PHP 和 Apache 也是如此,將結(jié)果返回給用戶。

我假設(不確定)nginx 的工作方式類似。

注意:我建議 Apache(和 nginx)按順序執(zhí)行。但我懷疑將 HTTP 請求交給 PHP 需要大約一毫秒,所以這個“串行”步驟不會解釋你找到的時間。

我得出結(jié)論,其中之一并沒有真正發(fā)生:

  • 每一步的配置都不允許 3 個孩子/連接/等,或者

  • 有 3 個單獨的 HTTP 請求。

  • 有 3 個單獨的 PHP 腳本。

  • 這 3 個 SQL 語句沒有相互阻塞。(請?zhí)峁?SQL。) 注意:ENGINE=MyISAM使用表鎖定;僅此一項就可以解釋問題。(請?zhí)峁?code>SHOW CREATE TABLE。)

有可能(在看到 SQL 之后)加快 SQL 的速度,從而減少緩慢的整體問題。

查詢

假設idPRIMARY KEY每個表的,那么這些其他索引可能有助于加快查詢 2:

backup_broadcast:  (deletion, id)

shares:  (media_type, media_id, site_id)

broadcast:  (site_id, id)

video:  (deletion, id)

playlists_playlists:  (playlist_id, broadcast_id)

playlist_broadcast聞起來像“多對多映射”表。如果是這樣,我建議遵循h(huán)ttp://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table中的提示。(對于任何類似的表格也是如此。)


OR并且IN ( SELECT ... )往往是低效的結(jié)構(gòu)。但聽起來你對查詢沒有任何控制權(quán)?


那是LIMIT沒有的ORDER BY嗎??你關心你得到哪 10 行嗎?這將是不可預測的。


這么多列會發(fā)生什么?似乎每次運行查詢時它們中的大多數(shù)都是相同的,因此主要是浪費時間?


對于查詢 3,site需要INDEX(deletion, customer_id)(按任意順序)。然而,重新制定它以使用 a JOINorEXISTS可能會運行得更快。


查看完整回答
反對 回復 2022-07-22
?
慕碼人2483693

TA貢獻1860條經(jīng)驗 獲得超9個贊

我認為您的 php 會話鎖定存在問題:您的第二個和第三個查詢正在嘗試訪問同一個 php 會話,并且正在等待。

嘗試盡快調(diào)用session_write_close,以釋放您的 php 會話。盡快:當您確定不會在 php 會話中寫入任何數(shù)據(jù)時。

一個簡單的檢查方法是嘗試使用 2 個瀏覽器或匿名/隱身模式:您的 cookie 不會被共享,并且您應該有 2 個會話,而不是相互阻止。


查看完整回答
反對 回復 2022-07-22
?
慕碼人8056858

TA貢獻1803條經(jīng)驗 獲得超6個贊

MySQL 可以處理大量并行查詢,但您不能在同一時間為每個連接執(zhí)行多個查詢。PHP 通常的設置方式是每個請求都轉(zhuǎn)到不同的線程/進程,因此每個進程都會有自己的 MySQL 連接,從而避免了上面提到的問題。除非您在 PHP 中使用持久連接,否則您最終可能會為每個請求使用相同的連接。如果是這種情況,應該很容易禁用它并返回到每個請求模型的標準一個數(shù)據(jù)庫連接。

我的第一個猜測是端點 2 在數(shù)據(jù)庫上觸發(fā)了一些鎖定,這就是為什么端點 3 查詢排隊直到 enpoint2 的查詢完成。這可以通過更改代碼中的邏輯(避免或最小化數(shù)據(jù)庫鎖定)或通過更改數(shù)據(jù)庫配置或用于更好地滿足應用程序需求的表引擎來解決。示例:InnoDB 使用行級鎖定,而 MyISAM 鎖定整個表鎖定。

如果您不介意配置它,分析將非常有用。如果你走這條路,我建議看看 Blackfire.io、New Relic 或 xdebug profiling。通過這種方式,您將能夠更快地找到瓶頸。


查看完整回答
反對 回復 2022-07-22
?
UYOU

TA貢獻1878條經(jīng)驗 獲得超4個贊

嗯……評論太長了。

稍微簡化一下,每個引擎都有一個隊列,用于收集要計算的查詢,具體取決于硬件,它使用 2 個或 3 個甚至更多線程來計算每個查詢。每個查詢需要更多的線程運行更多的時間,因為鎖,就像它鎖定整個表一樣,當它插入一個具有自動增量的新行時。(你會發(fā)現(xiàn)很多關于鎖的例子)。當然,每個查詢都需要內(nèi)存和其他資源,它們必須與服務器上運行的所有計算機軟件的其余部分共享。

使用集群,您需要為管理多個 sql 服務器付出代價。

所以從 sql server 端來看,它是并行的,但是你需要硬件來支持許多線程/許多引擎(應該非常小心地使用)

當然,你可以在 sql 中擁有多個用戶,但為了方便起見,通常每個 APP 一個,有時甚至每個服務器一個。但是同一個用戶可以同時訪問數(shù)據(jù)庫,當然你可以禁用它。

您的 php 并行運行,因為 Web 服務器是為運行 papallel 請求而構(gòu)建的,并且它運行 php、Python(django) 或 javascript(nodejs) 、 apache、 IIS、 nginx 都沒有關系,還有更多,每一種技術(shù)有沒有額外的好處,并且導致您添加到引擎的更多模塊,它變得慢得多。

因此,一切都在一定程度上是平行的,您可以增加您在云提供商或虛擬服務器等中看到的此類系統(tǒng)的功能。

只有在引入 Pokemon go 或新游戲時才會注意到這些限制,即使是大型云提供商也會崩潰?;蛘呤菉W巴馬醫(yī)改的災難,沒有進行如此規(guī)模的測試,無論哪個...負責,

并行化這樣的任務是困難的,因為在 webserver 和 sqlserver 的情況下,它必須在一定程度上緩存他們經(jīng)常發(fā)出的請求,但通常每個請求都需要自己的數(shù)據(jù)。

實際上一切都要復雜得多,從具有 3 個管道、多核和共享內(nèi)存(導致 Meltdown 及其兄弟)的 cpus 開始,遍歷僅駐留在內(nèi)存中以實現(xiàn)高性能的表或數(shù)據(jù)庫或僅在緩存中運行的 Web 服務器cpus,比內(nèi)存或硬盤快得多......


查看完整回答
反對 回復 2022-07-22
  • 4 回答
  • 0 關注
  • 189 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號