ã€ã³ã¿ãŒãããã«ã¯ãç»åã®ãµã€ãºãå€æŽããã®ã«ååãªèšäºãšãããžã§ã¯ãããããŸãã ãªããã1ã€å¿
èŠã§ããïŒ ãã®èšäºã§ã¯ãçŸåšã®ãœãªã¥ãŒã·ã§ã³ã«æºè¶³ã§ãããç¬èªã®ãœãªã¥ãŒã·ã§ã³ãåæžããªããã°ãªããªãã£ãçç±ã説æããŸãã
åé¡
ãŸããåçã®ãµã€ãºãå€æŽããçç±ãç解ããŸãããã ç§ãã¡ã¯ãWebãµãŒãã¹ãšããŠããŠãŒã¶ãŒã«ãšã£ãŠæãé«éãªããŒãžèªã¿èŸŒã¿ã«é¢å¿ãæã£ãŠããŸãã ãŠãŒã¶ãŒã¯ããã奜ã¿ãã³ã³ããŒãžã§ã³ãå¢ãããŸãã ãŠãŒã¶ãŒãäœéãŸãã¯ã¢ãã€ã«ã€ã³ã¿ãŒãããã䜿çšããŠããå ŽåãããŒãžã軜éã§ããããŠãŒã¶ãŒãã©ãã£ãã¯ãšããã»ããµãªãœãŒã¹ã浪費ããªãããšãéåžžã«éèŠã§ãã ããã«åœ¹ç«ã€ãã€ã³ãã®1ã€ã¯ãç»åã®ãµã€ãºå€æŽã§ãã
2ã€ã®åé¡ã解決ããŸãã æåã®åé¡ã¯ãç»åãå¿
èŠãªè§£å床ã«çµã蟌ãŸããªãããšãå€ãããšã§ããã€ãŸããã¯ã©ã€ã¢ã³ãã¯å¿
èŠã®ãªãããŒã¿ãããŠã³ããŒãããã ãã§ãªãããã©ãŠã¶ã䜿çšããŠç»åã®ãµã€ãºå€æŽã«CPUãªãœãŒã¹ãè²»ããå¿
èŠããããŸãã 解決çïŒãã©ãŠã¶ãŒã«è¡šç€ºããã解å床ã§ãŠãŒã¶ãŒã®åçãæäŸããŸãã
2çªç®ã®åé¡ã¯ãéåžžãç»åãååã«å§çž®ãããŠããªãããšã§ããã€ãŸããç»åãããæé©ã«ãšã³ã³ãŒãã§ãããããç»è³ªã䞻芳çã«æãªãããšãªãããŒãžã®èªã¿èŸŒã¿é床ãåäžããŸãã 解決çïŒã¯ã©ã€ã¢ã³ãã«æ»ãåã«ç»åãæé©åããŸãã
ãã®æ¹æ³ã®äŸãšããŠã
github.comã®ãããªæåãªãµã€ãã®ã¡ã€ã³ããŒãžãèŠãå¿
èŠã¯ãããŸããã 2 MBã®ããŒãžãŠã§ã€ãã§ã¯ããã®ãã¡ã®1.2ã¯æé©åãããŠããŠã³ããŒãã§ããªã圹ã«ç«ããªãã€ã¡ãŒãžã§ãã
2çªç®ã®äŸã¯Habrã§ãã èšäºãåŒã䌞ã°ããªãããã«ãã¹ã¯ãªãŒã³ã·ã§ããã¯æäŸããŸãããçµæã¯
åç
§ã«ãããã®ã§ãã åçã«habraã§èš±å¯ãå¿
èŠã«å€æŽããŸãããããããæé©åããŸããã ããã«ããããµã€ãºã650 KbïŒ50ïŒ
ïŒåæžãããŸãã
ãµã€ãã®å€ãã®å Žæã§ã¯ãããšãã°ãã¥ãŒã¹ãã£ãŒãã§ãã¥ãŒã¹ã®åçã®çž®å°çã衚瀺ããããã«ãåçã®å°ããããŒãžã§ã³ãå¿
èŠã§ãã ããã次ã®ããã«å®è£
ããŸããæé«å質ã®ç»åã®ã¿ããµãŒããŒã«ä¿åãããå¿
èŠã«å¿ããŠæŽæ°ããŒãžã§ã³ãæ¿å
¥ããã@ãã§URLã®æ«å°Ÿã«å¿
èŠãªè§£å床ãè¿œå ããŸãã 次ã«ããã¡ã€ã«ã§ã¯ãªãããµã€ãºå€æŽããã¯ãšã³ãã«ãªã¯ãšã¹ããéä¿¡ãããç»åã®æŽæ°ããæé©åãããããŒãžã§ã³ãè¿ãããŸãã
äžè¬çãªãœãªã¥ãŒã·ã§ã³
以äžã«è¿°ã¹ãããšã¯ãã¹ãŠãJPEGããã³PNGç»åã«é©çšãããŸãã ãããã¯ã€ã³ã¿ãŒãããã§æã人æ°ã®ãã圢åŒã§ãã
ãç»åãµã€ãºå€æŽããã¯ãšã³ããã®ãããªãã®ãã°ãŒã°ã«ã«æŒã蟌ãã åŸãNginxã®äœ¿çšãæšå¥šãããã±ãŒã¹ã®ååã§ãä»ã®éšåã¯ããŸããŸãªèªå·±èšè¿°åãµãŒãã¹ãã»ãšãã©ã®å ŽåNode.jsã§ããããšãããããŸãã
nginxããããŸãã¯ãããnginxã¢ãžã¥ãŒã«ã§äœ¿çšãããlibgdããã
ãã¹ãç»åã§63 RPSãå§çž®ã§ããŸããããããã¯æªãã¯ãããŸããããããé«éã§æè»æ§ãå¿
èŠã§ãã Graphicsmagickãé©åã§ã¯ãããŸããã é床ãé
ãããŸãã ããã«ããããã®ãœãªã¥ãŒã·ã§ã³ã¯ã©ã¡ããæé©åãããŠããªãç»åãçæããŸãã Nodeãªã©ã®ä»ã®ã»ãšãã©ã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ããµã€ãºå€æŽã«Sharpã䜿çšããJPEGç»åãæé©åããããã«MozJPEGã䜿çšããPNGãæé©åããããã«pngquantã䜿çšããããšããå§ãããŸãã
é·ãéãç§ãã¡ã¯pngquantã§Nod'yãLibvipsãMozJPEGã®ãµã¢ããºããŒæã䜿çšããŠããŸããããããæ¥ãããµã€ãºå€æŽãããéãããªãœãŒã¹ãããŸãå¿
èŠãšããªãããã«ããããšã¯ã§ããŸããïŒã
ãã¿ãã¬ïŒå¯èœã§ãã ;ïŒ
ããã§ãã¢ããªã±ãŒã·ã§ã³ãé«éåããæ¹æ³ãèŠã€ããããšãã§ããŸããã ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã調ã¹ãåŸãæé©åã«äœ¿çšãããimageminãç¹ã«MozJPEGããã³pngquantãã©ã°ã€ã³ãå®è¡ãããšãos.Execãä»ããŠåãååã®ãŠãŒãã£ãªãã£ããã«ãããããšãããããŸããã ãã®ã±ãŒã¹ã¯ééããªãåãåããC'shnyhã©ã€ãã©ãªãžã®ãã€ã³ãã£ã³ã°ã®ã¿ã䜿çšããŸãã ãµã€ãºå€æŽã«ã¯ãLibvips Cã©ã€ãã©ãªãžã®ãã€ã³ãã£ã³ã°ã§ããSharpã¢ãžã¥ãŒã«ã䜿çšãããŸããã
ç§ãã¡ã®å®è£
Guglezhã¯ãLibvipsãäŸç¶ãšããŠé床ã®ãªãŒããŒã§ãããOpenCVã ãããããšç«¶åã§ããããšã瀺ããŸããã ãã®ãããå®è£
ã«ã¯Libvipsã䜿çšããŸããããã¯æ¢ã«å®èšŒæžã¿ã®ãœãªã¥ãŒã·ã§ã³ã§ãããGoã®æ¢è£œã®ãã€ã³ãã£ã³ã°ããããŸãã ãããã¿ã€ããæžããäœãèµ·ããããè©ŠããŠã¿ãŸãããã
ãã®åé¡ã解決ããããã«Golangãéžã°ããçç±ã«ã€ããŠã®ããã€ãã®èšèã 第äžã«ãããã¯ååã«éãã§ãããããªãã¯ãŸã ç§éãéããµã€ãºå€æŽããããããšãèŠããŠããŸãã ãã®äžã«ããã³ãŒãã¯èªã¿ããããä¿å®ãç°¡åã§ãã æåŸã®èŠä»¶ã¯ãCã©ã€ãã©ãªãæäœã§ããããšã§ãããããã¯äŸ¿å©ã§ãã
ãããã¿ã€ãããã°ããäœæããŠãã¹ãããã·ã£ãŒããããå
éšã®ããããå€ãã«ãããããããLibvipsã¯æé©åãããŠããªãç»åãçæããããšã«æ°ä»ããŸããã ããã§äœãããå¿
èŠããããŸãã åã³å
šèœã®Googleã«ç®ãåãããšãæè¯ã®éžæè¢ã¯ãŸã MozJPEGã§ããããšãããããŸãã ããã§ãçããå¿ã³èŸŒã¿å§ããŸããNodeã«ãã£ããã®ãšåããã®ãGoã«ã®ã¿æžããŸãã ããããMoZJPEGã®èª¬æã泚ææ·±ãèªãã åŸããããlibjpeg-turboã®ãã©ãŒã¯ã§ãããäºææ§ãããããšãããããŸãã
ãšãŠãææã«èŠããŸãã äºã¯å°ãã-ç¬èªã®ããŒãžã§ã³ã®Libvipsãæ§ç¯ããããã«ãjpeg-turboãMozilaã®ããŒãžã§ã³ã«çœ®ãæããããŸãã ã¢ã»ã³ããªã«ã¯ãAlpine LinuxãéžæããŸããã ã¢ããªã±ãŒã·ã§ã³ã¯Dockerã䜿çšããŠå
¬éãããäºå®ã§ãããAlpineã¯Arch Linuxã§äœ¿çšããããã®ãšéåžžã«äŒŒãéåžžã«åªããããã±ãŒãžæ§æ圢åŒãæã£ãŠããŸãã
ç»åã®æé©åã«ãããç®ã«èŠããå質ã®äœäžãªãã«ãµã€ãºã4åã«çž®å°ãããŸãããå
ã®JPEG 351x527 79 kb | æé©å 351x527 17 Kb |
---|
 |  |
åéããã¹ãæžã¿ã Libvipsã¯ããµã€ãºå€æŽã«ããæé©åãããããŒãžã§ã³ãæäŸããããšããã«ã ã€ãŸããããŒãžã§ã³ã®NodeããŒãžã§ã³ã§ã¯ãæåã«ãµã€ãºãå€æŽããŠããããã³ãŒããŒãšã³ã³ãŒããŒãä»ããŠåã³ç»åãæž¡ããŸããã çŸåšããµã€ãºå€æŽã®ã¿ãè¡ã£ãŠããŸãã
JPEGãšãpngã®åŠçæ¹æ³ãç解ããŸããã ãã®åé¡ã解決ããããã«ãlibpngquantã©ã€ãã©ãªãèŠã€ãããŸããã ããã«åºã¥ããŠããã³ã³ãœãŒã«ãŠãŒãã£ãªãã£pngquantãå€ãã®ãœãªã¥ãŒã·ã§ã³ã§äœ¿çšãããŠãããšããäºå®ã«ãããããããããã¯ããŸã人æ°ããããŸããã ãŸããGoã®ãã€ã³ãã£ã³ã°ãèŠã€ãããŸããããå°ãæŸæ£ãããã¡ã¢ãªãªãŒã¯ãçºçããããããããä¿®æ£ããããã¥ã¡ã³ãããã®ä»ã®é©åãªãããžã§ã¯ãã«ãµãããããã¹ãŠã®ãã®ãè¿œå ããå¿
èŠããããŸããã ãŸããç°¡åã«ã€ã³ã¹ããŒã«ã§ããããã«libpngquantãAlpineããã±ãŒãžãšããŠã³ã³ãã€ã«ããŸããã
pngquantã䜿çšããŠåŠçããããã«ç»åããã¡ã€ã«ã«ä¿åããå¿
èŠããªããªã£ããããããã»ã¹ãå°ãæé©åã§ããŸãã ããšãã°ãLibvipsã§ãµã€ãºå€æŽãããšãã¯ç»åãå§çž®ãããpngquantã§åŠçããåŸã«ã®ã¿å§çž®ããŸãã ããã«ããããããã«è²Žéãªããã»ããµæéãç¯çŽãããŸãã èšããŸã§ããªããCã©ã€ãã©ãªã®åŒã³åºãã¯ã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ã®å®è¡ãããã¯ããã«é«éã§ããããã倧å¹
ã«ç¯çŽã§ããŸãã
ãµã€ãºã®éãã¯3åã§ãããã¢ãŒãã£ãã¡ã¯ãã衚瀺ãããå ŽåããããŸãïŒåçã«ãã£ãŠç°ãªããŸãïŒããªãªãžãã«PNG 450x300 200 Kb | æé©å 450x300 61 Kb |
---|
 |  |
å§çž®äžã«ã¢ãŒãã£ãã¡ã¯ããçŸãããããŸãè¯ããªãç»åã®äŸããªãªãžãã«PNG 351x527 270 kb | æé©å 351x527 40 Kb |
---|
 |  |
ãããã¿ã€ããäœæããPCã§ãã¹ãããã¢ãã€ã«2æ žããã»ã¹ã§é©åãª25 RPSãå®è¡ããCPUå
šäœãæ¶è²»ããåŸãéåžžã®ããŒããŠã§ã¢ã§ã©ãã ãçµãåºãããšãã§ãããã確èªããããšæããŸããã ã³ãŒãã6å°ã®æ žæ©ã§å®è¡ããJmeterãšWTFãèšå®ããŸã??? 30 RPSãååŸããŸãã ç§ãã¡ã¯ã©ã®ãããªãŽããèŠã€ããããšããŠããŸãã
Libvipsèªäœã¯ãã«ãã¹ã¬ãããå®è£
ããŠããŸããã€ãŸããã©ã€ãã©ãªãåæåããã ãã§ãããå°æ¥ã¯ã©ã®ã¹ããªãŒã ããã§ãå®å
šã«ã¢ã¯ã»ã¹ã§ããŸãã ããããäœããã®çç±ã§Libvipsã¯1ã€ã®ã¹ã¬ããã§æ©èœããããã1ã€ã®ã³ã¢ã«å¶éãããŸãã ãã1ã€ã®ã³ã¢ã¯pngquantã§ãã åèšãããšãåœç€Ÿã®è¶
é«éãªãµã€ã¶ãŒã¯éçºè
ã®ã©ãããããã§ã®ã¿å®å
šã«æ©èœããä»ã®ãã·ã³ã§ã¯ãã¹ãŠã®ãªãœãŒã¹ãå©çšã§ããªãããšãããããŸãã ;ïŒ
Libvipsã®ãœãŒã¹ã³ãŒããèŠããšãLibvipsã®ããŒã¿ç«¶åã«ãããCONCURRENCYãããã©ã«ãã§1ã«èšå®ãããŠããããšãããããŸãã ãããããã°ãã©ãã«ãŒã«ãããšããããã®åé¡ã¯é·ãéä¿®æ£ãããŠããŸãã CONCURRENCYãæ»ãããã¹ãããŸãã äœãå€ãã£ãŠããŸããããLibvipsã¯ãŸã ãã«ãã¹ã¬ããåãããç»åã®ãµã€ãºå€æŽãæåŠããŸããã ãã®åé¡ãå
æããããšããè©Šã¿ã¯ãã¹ãŠå€±æããå®ãèšããšãç§ã¯ããã解決ããããšã«ããããããå¥ã®ã¬ãã«ã§åé¡ãåé¿ããããšã«ããŸããã
å€ããå°ãªããææ°ã®Linuxã«ãŒãã«ïŒCentOS 6ã§ã¯3.9+ããã³2.6.32-417 +ïŒã¯ãã¹ãŠãSO_REUSEãªãã·ã§ã³ããµããŒãããŠããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãåãããŒãã䜿çšã§ããŸãã ãã®ã¢ãããŒãã¯ãHAProxyãªã©ã®ãµãŒãããŒãã£ãœãããŠã§ã¢ãšã®ãã©ã³ã¹ãåãããã䟿å©ã§ãã èšå®ã¯äžèŠã§ãã€ã³ã¹ã¿ã³ã¹ããã°ããè¿œå ããã³åé€ã§ããŸãã
ãã®ãããDocker composeã§SO_REUSEããã³ã--scaleããªãã·ã§ã³ã䜿çšããŸãããããã«ãããå®è¡ããã€ã³ã¹ã¿ã³ã¹ã®æ°ãæå®ã§ããŸãã
枬å®ããæé
ç§ãã¡ã®åŽåã®çµæãè©äŸ¡ããæãæ¥ãŸããã
æ§æïŒ
- CPUïŒIntel Xeon E5-1650 v3 @ 3.50GHz 6ã³ã¢ïŒ12 vCPUïŒ
- RAMïŒ64 GbïŒçŽ1-2 Gbã䜿çšïŒ
- åŽåè
æ°ïŒ12
çµæïŒ
WikiããŒãžã§ã®ããå€ãã®ãã³ãããŒã¯ïŒããŒãããŒãžã§ã³ãšã®æ¯èŒã¯ãããŸãããïŒã
ã芧ã®ãšããããµã€ãºå€æŽãç¡é§ã«ããçŽãããšã¯ãããŸããã§ãããé床ã®å¢å ã¯30ãã400ïŒ
ã§ããïŒå Žåã«ãã£ãŠã¯ïŒã ããã«é«éã«ãµã€ãºå€æŽããå¿
èŠãããå Žåã¯ãlibimagequantã®ãé床ãããã³ãå質ããããåãããšãã§ããŸãã ãµã€ãºãããã«å°ããããããç»è³ªãç ç²ã«ããŠãšã³ã³ãŒãé床ãäžãããã§ããŸãã
GitHubãããžã§ã¯ãã³ãŒãã
GitHubã§ãlibimagequantã«ãã€ã³ãã
ãŸã ã