Pegjs: [์งˆ๋ฌธ] {cache: true} ๋ฐ ํ•ฉ๋ฆฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์‚ฌ๋ก€ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์กฐ์–ธ

์— ๋งŒ๋“  2018๋…„ 11์›” 22์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pegjs/pegjs

๋ฌธ์ œ ์œ ํ˜•

  • ์งˆ๋ฌธ: ๋„ค

์ „์ œ ์กฐ๊ฑด

  • ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?: ์˜ˆ
  • ์ €์žฅ์†Œ ๋ฌธ์ œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์…จ์Šต๋‹ˆ๊นŒ?: ์˜ˆ, GitHub ๋ฌธ์ œ์—์„œ cache ๋ฅผ ๋ณด์•˜๊ณ  ์บ์‹œ์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ฐพ์•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์š”์ฒญํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ํฌ๋Ÿผ์„ ํ™•์ธํ•˜์…จ์Šต๋‹ˆ๊นŒ?: ์˜ˆ, googlegroups/cache ์‹œ๋„, ๊ด€๋ จ ๊ฒฐ๊ณผ ์—†์Œ
  • ์›น ๊ฒ€์ƒ‰(google, yahoo ๋“ฑ)์„ ์ˆ˜ํ–‰ํ•˜์…จ์Šต๋‹ˆ๊นŒ?: ์˜ˆ

์„ค๋ช…

~1000์ค„์˜ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ๋‹นํžˆ ๋ฌด๊ฑฐ์šด(500KB) ์‚ฌ์šฉ์ž ์ œ๊ณต ํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • {cache: true} ์ „๋‹ฌํ•  ๋•Œ ...

    • ... Node์—๊ฒŒ 3GB์˜ ํž™( --max-old-space-size=3000 )์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œํ•˜๋ฉด ํž™์ด 2.5GB๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  12์ดˆ ํ›„์— ๊ตฌ๋ฌธ ๋ถ„์„์ด ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    • ... ๋…ธ๋“œ 10์„ ๊ธฐ๋ณธ ํž™ 800MB๋กœ ๋‘๋ฉด ๊ตฌ๋ฌธ ๋ถ„์„์ด OOM๊ณผ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

  • {cache: false} ์ „๋‹ฌํ•  ๋•Œ ์˜ˆ์ƒ๋Œ€๋กœ ํŒŒ์‹ฑ ํด๋Ÿญ์ด 10์ดˆ(๋ณ‘๋ฆฌ์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ)์—์„œ ์•ฝ๊ฐ„ ๋” ๋นจ๋ผ์ง€๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋Š˜์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์ด๊ณ  ๋‚ด ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ X+1GB์˜ ํž™์ด ํ•„์š”ํ•œ 1MB ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ XGB์˜ ํž™์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋…ธ๋“œ๋ฅผ ์ถฉ๋Œ์‹œํ‚ค๋Š” ๊ฒƒ์€ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ {cache: true} ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. "๋ณ‘๋ฆฌํ•™์ ์ธ ๊ฒฝ์šฐ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์ธ ๊ตฌ๋ฌธ ๋ถ„์„ ์‹œ๊ฐ„์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด" ์ œ๊ฐ€ ๋งŒ๋‚œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๊นŒ?

  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ค‘์š”ํ•ด์ง€๋ฉด ๊ตฌ์ œํ•˜๊ธฐ ์œ„ํ•ด PEG.js์— ๋‚ด์žฅ๋œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ Node OOM์„ ๊ฐ€๋กœ์ฑ„๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์ž…๋ ฅ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ {cache: true} ์šฉ๋„๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด CPU ์‚ฌ์šฉ๋Ÿ‰์ด ๋” ๋งŽ์•„์ง€์ง€๋งŒ ์ ์–ด๋„ OOM์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์•„์ด๋””์–ด?

PEG.js์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๐Ÿ™‚

์†Œํ”„ํŠธ์›จ์–ด

  • PEG.js: 0.10.0
  • Node.js: 10.13.0
  • NPM ๋˜๋Š” ์›์‚ฌ: npm 6.4.1
  • ๋ธŒ๋ผ์šฐ์ €: ํ•ด๋‹น ์—†์Œ
  • OS: AWS ๋ฆฌ๋ˆ…์Šค
performance question

๋ชจ๋“  3 ๋Œ“๊ธ€

๊ธฐํ•˜๊ธ‰์ˆ˜์ ์ธ ๊ตฌ๋ฌธ ๋ถ„์„ ์‹œ๊ฐ„์€ ๋งค์šฐ ๋ณ‘๋ฆฌํ•™์ ์ธ ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•˜๋ฉฐ ๊ฑฐ๊ธฐ์—์„œ ๋ฌธ๋ฒ•์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
https://github.com/sirthias/pegdown/issues/43#issuecomment -18469752 ๊ณ ๋ ค
(์ €๋Š” ๊ธฐ์—ฌ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค)

@polkovnikov-ph๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ๋ณ‘๋ฆฌํ•™ ์  ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฌธ๋ฒ• ๋ถ€๋ถ„์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์ง€๋งŒ OOM ์‚ฌ๋ก€๋ฅผ ๊ณ„์† ์น˜๋Š” ๊ฒฝ์šฐ (@ronjouch) ์ œ์•ˆํ•œ๋Œ€๋กœํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ ํฌ๊ธฐ์— ๋”ฐ๋ผ _cache_ ์˜ต์…˜ ์ „ํ™˜: cache: input.length >= 250000

๊ทธ ํ›„(์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ํ…์ŠคํŠธ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ) OOM ์‚ฌ๋ก€์— ๋„๋‹ฌํ•˜๋Š” ์ž…๋ ฅ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ ๋ณ‘๋ฆฌํ•™ ์‚ฌ๋ก€๋ฅผ ์ฐพ๊ณ  ๋ฌธ๋ฒ•์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ OOM ์‚ฌ๋ก€ ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋„๋ก ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์•ฑ์„ ์น˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ OOM ์‚ฌ๋ก€๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฌธ๋ฒ•์„ ๋‹ค์‹œ ์ž‘์„ฑํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋„๊ตฌ ์ฒด์ธ์— ์ถ”๊ฐ€ ํŒจ์Šค(๋˜๋Š” ๋ช‡ ๊ฐœ)๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • ํฐ ์ž…๋ ฅ์„ ๋ถ„ํ• ํ•˜๊ณ  ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๊ตฌ๋ฌธ์˜ ์ผ๋ถ€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ฌธ๋ฒ•์„ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ ๋ชจ๋“  ์ž…๋ ฅ ์กฐ๊ฐ์ด ๊ตฌ๋ฌธ ๋ถ„์„๋˜๋ฉด ๋ชจ๋“  ๊ฒƒ์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค(์ƒ์„ฑ๋œ ํŒŒ์„œ๊ฐ€ AST๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ™•์‹คํ•˜์ง€ ์•Š์Œ)
  • regex๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 2๊ฐœ์˜ ์ƒ์„ฑ๋œ ํŒŒ์„œ ์ค‘ ํ•˜๋‚˜๋กœ ๋ณด๋‚ด๊ธฐ ์ „์— ๋ณ‘๋ฆฌํ•™์  ์‚ฌ๋ก€๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ œ๊ณต ํ…์ŠคํŠธ์˜ ๊ตฌ๋ฌธ์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์ผ๋ฐ˜ ํŒŒ์„œ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ณ‘๋ฆฌํ•™์  ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ญ์ƒ PEG.js ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฌ๋‚˜์ด์ €์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ํŒŒ์„œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ •์ƒ์ ์ธ ์ž…๋ ฅ๊ณผ ๋ณ‘์  ์‚ฌ๋ก€๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ์ด ํฌํ•จ๋œ ์ž…๋ ฅ์„ ๋ชจ๋‘ ์ตœ์ ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์„œ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์„œ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ํŒŒ์„œ ์ƒ์„ฑ๊ธฐ์˜ ๋ชฉ์ ์„ ๋ฌด์ƒ‰ํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋งŒ _๋‹น์‹ ์ด ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•ˆ๋‹ค๋ฉด ๊ฑฐ์˜ ํ•ญ์ƒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค_)

@polkovnikov-ph @futagoza ์‹œ๊ฐ„์„ ๋‚ด์–ด ์กฐ์–ธ์„ ํ•ด์ฃผ์‹  ๋‘

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

futagoza picture futagoza  ยท  6์ฝ”๋ฉ˜ํŠธ

dmajda picture dmajda  ยท  15์ฝ”๋ฉ˜ํŠธ

mattkanwisher picture mattkanwisher  ยท  5์ฝ”๋ฉ˜ํŠธ

StoneCypher picture StoneCypher  ยท  8์ฝ”๋ฉ˜ํŠธ

marek-baranowski picture marek-baranowski  ยท  6์ฝ”๋ฉ˜ํŠธ