簡體   English   中英

為什么 Apache 會產生太多進程?

[英]Why Apache spawns too much processes?

我的 LAMP 服務器上有一個 WordPress 博客。 我必須在短時間內向 WordPress API 發出 20.000 個 POST 請求才能創建帖子(我從其他 CMS 遷移到 WordPress)。

為此,我運行我的遷移腳本,它需要點擊https://example.com/wp-json/wp/v2/posts端點 20.000 次。 在 ~1000 次請求后,我的服務器速度變慢,平均負載變為15 當我檢查top時,這就是我得到的:

 5827 www-data  20   0  943612  73000  33424 S  4.7  3.6   0:24.62 apache2
 5828 www-data  20   0  943960  79112  38768 S  4.0  3.9   0:16.26 apache2
 5861 www-data  20   0  944280  86568  45968 S  4.0  4.3   0:06.47 apache2
 6047 www-data  20   0  943692  77288  37292 S  3.7  3.8   0:00.46 apache2
 5835 www-data  20   0  942212  85760  47096 S  3.3  4.2   0:05.01 apache2
27086 mysql     20   0 1208472 187212  21124 S  3.0  9.3  18:52.19 mysqld
 5863 www-data  20   0  944452 103896  64936 S  2.7  5.1   0:06.97 apache2
 5826 www-data  20   0  942604 102272  63264 S  2.0  5.1   0:06.66 apache2
 5854 www-data  20   0  944252  84776  46180 S  1.3  4.2   0:06.96 apache2
 5967 www-data  20   0  941856  82388  44128 S  1.3  4.1   0:03.98 apache2
 6046 www-data  20   0  943692  77476  37356 S  1.3  3.8   0:00.51 apache2
 5860 www-data  20   0  942224  84668  46048 S  0.7  4.2   0:06.93 apache2
 6059 www-data  20   0  941644  75192  37164 S  0.7  3.7   0:00.20 apache2

當我停止遷移腳本時,這些進程仍在運行,並且高服務器負載保持在相同的值(大約15 )。 唯一有幫助的是sudo apachectl restart 但后來我重置了 apache2,再次運行遷移腳本,然后在 1000 個請求加載 go 后再次高。

Apache spawns process to handle requests: assuming you're using MPM, you can tune it following the official documentation.( https://httpd.apache.org/docs/2.4/mod/mpm_common.html#maxrequestworkers ) Access logs and error日志可能會幫助您了解正在發生的事情。

問題可能出在其他地方,例如在數據庫上:也許它沒有經過調整來處理 WP 正在生成的負載來存儲您想要保存的調用 API 的信息。

此外,您可以嘗試降低腳本調用 api 的頻率,而不是調整 apache/mysql/mariadb/postgreSQL。 您可以嘗試降低

你有這么多進程,因為這就是 apache 被告知的行為方式。 @Inc0 提供的鏈接將為您提供一些如何限制使用量的線索。 為了更快的恢復時間,您應該設置較低的 MaxSpareServers。

平均負載達到 15

如果您的負載高於 CPU 線程數,則 kernel 將啟動搶占進程 - 這意味着您的吞吐量將下降。 多少,我真的不能說。 但是,如果這是一次性練習,您准備花多少時間和精力將其更快地升級到 go,而不是僅僅繼續加載數據/降低效率?

我運行我的遷移腳本

這是多線程/使用 curl_multi-* 函數嗎? 我不希望單線程操作會導致如此多的持久負載。 你會從 mod_status 中得到很多關於發生了什么的線索。 無論如何,您似乎沒有在您的客戶端中使用keepalive(或在您的服務器上禁用它)。 在兩端啟用此功能應該會對負載/性能產生重大影響。

我從其他 CMS 遷移到 WordPress

所以這就是XY問題。

Wordpress 非常慢且資源繁重。 您最大的勝利將來自繞過 Wordpress 並將數據直接寫入數據庫。 第二好的方法是在 Wordpress 中使用內置的批量導入 function (它也導出,因此您可以看到數據結構)。 作為Wordpress,還有幾個第三方插件可以使用(但是請在導入完成后卸載插件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM