亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何優化服務器上??的 ImageMagick CPU 使用率

如何優化服務器上??的 ImageMagick CPU 使用率

Go
拉莫斯之舞 2023-05-22 17:06:55
我正在嘗試使用 ImageMagick 將一個圖像重疊在另一個圖像之上。我設置了一個 AWS beanstalk 機器,它有 16 個核心 cpu 和 32gb ram(c5 4x 大),并在 Go 環境中運行代碼。每當 GET 請求到達服務器時,都會執行以下 shell 命令。這是我正在運行的命令cmd := "convert "+ img1 + " -page +"+fmt.Sprintf("%.1f", offsetX)+"+"+fmt.Sprintf("%.1f", offsetY) + " " + img2 + " -background none -flatten "+outputFilePathcmdout,err := exec.Command("sh","-c",cmd).CombinedOutput()//convert img1.png -page +10+10 img2.png -background none -flatten  output.pngimg1 的大小約為 500x500,im2 的大小約為 200x200我進行了負載測試,發現當前設置每秒只能處理 15 個請求,CPU 使用率為 51%。在 25req/sec 時,cpu 使用率變為 95%。我堅信我做錯了什么。我正在使用 Imagemagick v6.7.8。升級到最新版本或從源代碼(而不是 yum install)編譯 ImageMagick 有幫助嗎?我應該怎么做才能滿足 100req/sec 并確保所有 vCPU 都得到最佳利用
查看完整描述

1 回答

?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

我試過我的 2015 i5 筆記本電腦(兩個核心,四個線程)。我做了一些這樣的測試數據:


$ mkdir sample

$ cd sample

$ vipsheader ../fg.png ../bg.png?

../fg.png: 200x200 uchar, 4 bands, srgb, pngload

../bg.png: 500x500 uchar, 4 bands, srgb, pngload

$ for i in {0..1000}; do cp ../fg.png fg$i.png; done

$ for i in {0..1000}; do cp ../bg.png bg$i.png; done

所以 1,000 張 500x500 和 200x200 PNG 圖像。


首先,基本情況(IM 6.9.10):


$ time for i in {0..1000}; do convert bg$i.png -page +10+10 fg$i.png -background none -flatten out$i.png; done

real? ? 0m49.461s

user? ? 1m4.875s

sys 0m6.690s

49s 大約是每秒 20 次操作。


接下來,我嘗試使用 GNU parallel。這是并行運行足夠多的內核以保持所有內核加載的簡單方法:


$ time parallel convert bg{}.png -page +10+10 fg{}.png -background none -flatten? out{}.png ::: {0..1000}

real? ? 0m32.278s

user? ? 1m46.428s

sys 0m11.897s

32s 是 31 次操作/秒。這是在雙核筆記本電腦上進行的——您會發現使用更大的臺式機可以獲得更好的加速。

最后,我寫了一個小的pyvips程序來完成你的任務。pyvips 是libvips的 Python 綁定,但也有 Go 綁定。

import pyvips


for i in range(0, 1000):

? ? bg_name = "bg" + str(i) + ".png"

? ? fg_name = "fg" + str(i) + ".png"

? ? out_name = "out" + str(i) + ".png"


? ? bg = pyvips.Image.new_from_file(bg_name, access="sequential")

? ? fg = pyvips.Image.new_from_file(fg_name, access="sequential")


? ? result = bg.composite2(fg, "over", x=10, y=10)


? ? result.write_to_file(out_name)

我懂了:


$ time ~/try/try289.py?

real? ? 0m25.887s

user? ? 0m36.625s

sys 0m1.442s

26s 大約是每秒 40 次操作。如果并行運行多個,您將能夠更快地獲得它。


您遇到的限制之一是 PNG 格式——該庫是單線程的,而且速度很慢。如果你愿意嘗試 TIFF,你可以獲得相當多的速度。


帶放氣壓縮的 TIFF 在功能上類似于 PNG。如果我嘗試:


$ vips copy fg.png fg.tif[compression=deflate]

$ vips copy bg.png bg.tif[compression=deflate]

$ ls -l bg.*

-rw-r--r-- 1 john john 19391 Dec 27 20:48 bg.png

-rw-r--r-- 1 john john 16208 Jan? 2 18:36 bg.tif

所以在這種情況下,它實際上要小一些。如果我將 pyvips 程序更改為:


bg_name = "bg" + str(i) + ".tif"

fg_name = "fg" + str(i) + ".tif"

out_name = "out" + str(i) + ".tif[compression=deflate]"

運行它,我看到:


$ time ~/try/try289.py?

real? ? 0m17.618s

user? ? 0m23.234s

sys 0m1.823s

大約 55 次操作/秒。


查看完整回答
反對 回復 2023-05-22
  • 1 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號