์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ”ฅ Flame Graphs: CPU ์„ฑ๋Šฅ ์‹œ๊ฐํ™”์˜ ๋งˆ๋ฒ• ๐Ÿ”

๐Ÿ”ฅ Flame Graphs: CPU ์„ฑ๋Šฅ ์‹œ๊ฐํ™”์˜ ๋งˆ๋ฒ• ๐Ÿ”

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„์„ ์ฐพ์•„์™”์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ Flame Graphs์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณผ ๊ฑด๋ฐ์š”. CPU ์„ฑ๋Šฅ์„ ์‹œ๊ฐํ™”ํ•˜๋Š” ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์— ๋Œ€ํ•ด ํ•จ๊ป˜ ์•Œ์•„๋ณด๋ฉด์„œ, ๋งˆ์น˜ ๋ถˆ๊ฝƒ์ฒ˜๋Ÿผ ํƒ€์˜ค๋ฅด๋Š” ์„ฑ๋Šฅ ๋ถ„์„์˜ ์„ธ๊ณ„๋กœ ์—ฌ๋Ÿฌ๋ถ„์„ ์ดˆ๋Œ€ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿš€

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ํ”„๋กœ๊ทธ๋žจ์ด ๋А๋ฆฌ๊ฒŒ ๋™์ž‘ํ•˜๊ฑฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ์˜ˆ์ƒ๋งŒํผ ๋น ๋ฅด์ง€ ์•Š๋‹ค๊ณ  ๋А๋‚€ ์  ์žˆ๋‚˜์š”? ๊ทธ๋Ÿด ๋•Œ๋งˆ๋‹ค "๋„๋Œ€์ฒด ์–ด๋””์„œ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ์ผ์–ด๋‚˜๋Š” ๊ฑธ๊นŒ?" ํ•˜๊ณ  ๊ณ ๋ฏผํ•ด ๋ณธ ์  ์žˆ์œผ์‹œ์ฃ ? ๋ฐ”๋กœ ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ Flame Graphs๊ฐ€ ์šฐ๋ฆฌ์˜ ๊ตฌ์„ธ์ฃผ๊ฐ€ ๋˜์–ด์ค„ ๊ฒ๋‹ˆ๋‹ค! ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ์ฐพ์•„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋“ฏ, Flame Graphs๋Š” ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๋ฐ ํƒ์›”ํ•œ ์žฌ๋Šฅ์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜‰

๐ŸŒŸ Flame Graphs๋ž€?

Flame Graphs๋Š” CPU ์‹œ๊ฐ„์˜ ์‚ฌ์šฉ์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ ํ•จ์ˆ˜๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ CPU ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์ฃ . ๋งˆ์น˜ ๋ถˆ๊ฝƒ์ด ํƒ€์˜ค๋ฅด๋Š” ๋ชจ์–‘๊ณผ ๋น„์Šทํ•ด์„œ 'Flame Graphs'๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์—ˆ๋‹ต๋‹ˆ๋‹ค!

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Flame Graphs์˜ ์„ธ๊ณ„๋กœ ๋›ฐ์–ด๋“ค์–ด๋ณผ๊นŒ์š”? ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์ถœ๋ฐœ~! ๐Ÿ

๐Ÿ”ฅ Flame Graphs์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

Flame Graphs๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด, ์šฐ์„  ๊ทธ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์‚ดํŽด๋ด์•ผ๊ฒ ์ฃ ? ๋งˆ์น˜ ์š”๋ฆฌ๋ฅผ ๋ฐฐ์šธ ๋•Œ ์žฌ๋ฃŒ๋ถ€ํ„ฐ ์•Œ์•„๊ฐ€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์—์š”! ๐Ÿณ

1. ์Šคํƒ ํŠธ๋ ˆ์ด์Šค(Stack Trace)์˜ ์ค‘์š”์„ฑ

Flame Graphs์˜ ํ•ต์‹ฌ์€ ๋ฐ”๋กœ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค์— ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ž€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด์—์š”. ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์ง‘์„ ์ฐพ์•„๊ฐˆ ๋•Œ ๊ฑฐ์น˜๋Š” ๊ธธ๋ชฉ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ ์–ด๋†“์€ ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ฃ .

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”? ๐Ÿค”


main()
  โ†’ process_data()
    โ†’ sort_array()
      โ†’ compare_elements()
  

์ด๋Ÿฐ ์‹์œผ๋กœ, main ํ•จ์ˆ˜์—์„œ ์‹œ์ž‘ํ•ด์„œ process_data๋ฅผ ๊ฑฐ์ณ sort_array๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ compare_elements ํ•จ์ˆ˜๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์žฌ๋Šฅ๋„ท์—์„œ ์›ํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •๊ณผ ๋น„์Šทํ•˜๋„ค์š”! ๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ ์‹œ์ž‘ํ•ด์„œ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๊ณ , ์„ธ๋ถ€ ์„œ๋น„์Šค๋ฅผ ๊ณ ๋ฅด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์—์š”. ๐Ÿ˜Š

2. ์ƒ˜ํ”Œ๋ง(Sampling)์˜ ๋งˆ๋ฒ•

์ƒ˜ํ”Œ๋ง์€ Flame Graphs๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์žˆ์–ด ํ•ต์‹ฌ์ ์ธ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ฃผ๊ธฐ์ ์œผ๋กœ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•˜๋Š”๋ฐ์š”, ์ด๋Š” ๋งˆ์น˜ ์š”๋ฆฌ์‚ฌ๊ฐ€ ์Œ์‹์„ ๋งŒ๋“ค๋ฉด์„œ ์ค‘๊ฐ„์ค‘๊ฐ„ ๋ง›์„ ๋ณด๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”!

๐Ÿ’ก ์ƒ˜ํ”Œ๋ง์˜ ์žฅ์ :

  • ์ „์ฒด ์‹คํ–‰ ๊ณผ์ •์„ ๋ชจ๋‘ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ๋„ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ˆ˜์ง‘๋œ ์ƒ˜ํ”Œ๋“ค์€ ๋งˆ์น˜ ํผ์ฆ ์กฐ๊ฐ์ฒ˜๋Ÿผ ๋ชจ์—ฌ์„œ ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ๋ชจ์Šต์„ ๊ทธ๋ ค๋‚ด๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ . ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ๋“ค์ด ๋ชจ์—ฌ ํ•˜๋‚˜์˜ ํ’์„ฑํ•œ ํ”Œ๋žซํผ์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”! ๐Ÿงฉ

3. ์‹œ๊ฐํ™”: ๋ถˆ๊ฝƒ์œผ๋กœ ํƒ€์˜ค๋ฅด๋Š” ๋ฐ์ดํ„ฐ

์ž, ์ด์ œ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ด์—์š”! ์ˆ˜์ง‘๋œ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋“ค์„ ์–ด๋–ป๊ฒŒ ์‹œ๊ฐํ™”ํ• ๊นŒ์š”? ๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ Flame Graphs์˜ ์ง„๊ฐ€๊ฐ€ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค. ๐ŸŽจ

Flame Graphs๋Š” ์ˆ˜์ง ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„์˜ ํ˜•ํƒœ๋ฅผ ๋ ๊ณ  ์žˆ์–ด์š”. ๊ฐ ๋ง‰๋Œ€๋Š” ํ•จ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ง‰๋Œ€์˜ ๋„ˆ๋น„๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ CPU ์‹œ๊ฐ„์„ ์–ผ๋งˆ๋‚˜ ์‚ฌ์šฉํ–ˆ๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋„“์„์ˆ˜๋ก ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๋œป์ด์ฃ !

Flame Graph A simplified flame graph stack with five layers and a compact legend indicating heat from hot to cool. Flame Graph Hot Cool swap() compare_elements() sort_array() process_data() main()

์œ„์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด์„ธ์š”. ๋งˆ์น˜ ๋ถˆ๊ฝƒ์ด ํƒ€์˜ค๋ฅด๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š๋‚˜์š”? ๐Ÿ”ฅ ๊ฐ€์žฅ ์•„๋ž˜์˜ ๋„“์€ ๋ถ€๋ถ„์ด main() ํ•จ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ์œ„๋กœ ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก ๋” ์„ธ๋ถ€์ ์ธ ํ•จ์ˆ˜๋“ค์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ฐ ํ•จ์ˆ˜์˜ ๋„ˆ๋น„๊ฐ€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ CPU ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ–ˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฑฐ์˜ˆ์š”.

๐Ÿ” Flame Graphs ์ฝ๋Š” ๋ฒ•:

  • ์œ„๋กœ ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก ๋” ๊นŠ์€ ํ˜ธ์ถœ ์Šคํƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ์˜†์œผ๋กœ ๋„“์„์ˆ˜๋ก ๋” ๋งŽ์€ CPU ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๋œป์ด์—์š”.
  • ์ƒ‰์ƒ์€ ๋ณดํ†ต ํ•จ์ˆ˜์˜ ์ข…๋ฅ˜๋‚˜ ๋ชจ๋“ˆ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ Flame Graphs๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ๋ฆ„๊ณผ ๊ฐ ๋ถ€๋ถ„์˜ ์„ฑ๋Šฅ์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ . ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ๋“ค์˜ ์ธ๊ธฐ๋„์™€ ํ™œ์šฉ๋„๋ฅผ ํ•œ ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์—์š”! ๐Ÿ‘€

์ž, ์ด์ œ Flame Graphs์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑธ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ Flame Graphs๋ฅผ ๋งŒ๋“ค๊ณ  ํ™œ์šฉํ•˜๋Š”์ง€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ• ๊นŒ์š”? ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ๊ณ„์†ํ•ด์„œ Flame Graphs์˜ ์„ธ๊ณ„๋กœ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€ ๋ด…์‹œ๋‹ค! ๐Ÿš€

๐Ÿ› ๏ธ Flame Graphs ์ƒ์„ฑํ•˜๊ธฐ: ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ

์ž, ์ด์ œ ์‹ค์ œ๋กœ Flame Graphs๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค! ๋งˆ์น˜ ์š”๋ฆฌ ๋ ˆ์‹œํ”ผ๋ฅผ ๋”ฐ๋ผ ๋ง›์žˆ๋Š” ์š”๋ฆฌ๋ฅผ ๋งŒ๋“ค๋“ฏ์ด, ๋‹จ๊ณ„๋ณ„๋กœ Flame Graphs๋ฅผ ์ƒ์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ

1. ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ ์„ ํƒํ•˜๊ธฐ

Flame Graphs๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ์ ์ ˆํ•œ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์ง€๋งŒ, ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ด๋“œ๋ฆด๊ฒŒ์š”:

  • perf (Linux): Linux ์‹œ์Šคํ…œ์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
  • DTrace (Solaris, macOS, FreeBSD): ์œ ๋‹‰์Šค ๊ณ„์—ด ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ•๋ ฅํ•œ ํŠธ๋ ˆ์ด์‹ฑ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
  • eBPF (Linux): ์ตœ์‹  Linux ์ปค๋„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ๊ธ‰ ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
  • Xperf (Windows): Windows ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„ฑ๋Šฅ ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์ด ์ค‘์—์„œ ์šฐ๋ฆฌ๋Š” Linux ์‹œ์Šคํ…œ์—์„œ ๊ฐ€์žฅ ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” perf๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. perf๋Š” ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์žฌ๋‹ค๋Šฅํ•œ ํ”„๋ฆฌ๋žœ์„œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์˜ˆ์š”! ๐Ÿ˜Š

2. ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ํ•˜๊ธฐ

์ž, ์ด์ œ perf๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ด๋ณผ๊นŒ์š”? ์ด ๊ณผ์ •์€ ๋งˆ์น˜ ์š”๋ฆฌ์˜ ์žฌ๋ฃŒ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์‹ ์„ ํ•˜๊ณ  ์ข‹์€ ์žฌ๋ฃŒ๊ฐ€ ์žˆ์–ด์•ผ ๋ง›์žˆ๋Š” ์š”๋ฆฌ๊ฐ€ ๋‚˜์˜ค๋“ฏ, ์ •ํ™•ํ•œ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด์•ผ ์œ ์šฉํ•œ Flame Graph๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

๐Ÿ–ฅ๏ธ perf๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ช…๋ น์–ด:

sudo perf record -F 99 -a -g -- sleep 60

์ด ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

  • -F 99: ์ดˆ๋‹น 99๋ฒˆ ์ƒ˜ํ”Œ๋ง
  • -a: ๋ชจ๋“  CPU์—์„œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
  • -g: ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„ ์ •๋ณด ์ˆ˜์ง‘
  • sleep 60: 60์ดˆ ๋™์•ˆ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, perf๋Š” 60์ดˆ ๋™์•ˆ ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  CPU์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ 60์ดˆ ๋™์•ˆ ๋ชจ๋“  ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์ธ๊ธฐ ์žˆ๋Š” ์„œ๋น„์Šค๋“ค์„ ์Šค์บ”ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ฃ ! ๐Ÿ•ต๏ธโ€โ™‚๏ธ

3. ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ํ•˜๊ธฐ

๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ–ˆ๋‹ค๋ฉด, ์ด์ œ ์ด๋ฅผ Flame Graph ์ƒ์„ฑ ๋„๊ตฌ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ๋งˆ์น˜ ์ˆ˜์ง‘ํ•œ ์žฌ๋ฃŒ๋ฅผ ์š”๋ฆฌํ•˜๊ธฐ ์ข‹๊ฒŒ ์†์งˆํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”!

perf์—์„œ ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

sudo perf script > out.perf

์ด ๋ช…๋ น์–ด๋Š” perf๊ฐ€ ์ˆ˜์ง‘ํ•œ raw ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ์˜ '์žฌ๋ฃŒ'๊ฐ€ ์š”๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฑฐ์˜ˆ์š”! ๐Ÿฅ—

4. Flame Graph ์ƒ์„ฑํ•˜๊ธฐ

์ž, ๋“œ๋””์–ด ์šฐ๋ฆฌ์˜ Flame Graph๋ฅผ ๋งŒ๋“ค ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค! ์ด ๊ณผ์ •์€ ๋งˆ์น˜ ๋ชจ๋“  ์žฌ๋ฃŒ๋ฅผ ํ•œ๋ฐ ๋ชจ์•„ ๋ฉ‹์ง„ ์š”๋ฆฌ๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” Brendan Gregg๊ฐ€ ๊ฐœ๋ฐœํ•œ FlameGraph ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฑฐ์˜ˆ์š”.

๋จผ์ €, FlameGraph ๋„๊ตฌ๋ฅผ GitHub์—์„œ ํด๋ก ํ•ฉ๋‹ˆ๋‹ค:

git clone https://github.com/brendangregg/FlameGraph.git
cd FlameGraph

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ Flame Graph๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

./stackcollapse-perf.pl < /path/to/out.perf | ./flamegraph.pl > flamegraph.svg

์ด ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด, ๋“œ๋””์–ด ์šฐ๋ฆฌ์˜ ์•„๋ฆ„๋‹ค์šด Flame Graph๊ฐ€ ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰

์™„์„ฑ๋œ Flame Graph ์˜ˆ์‹œ main() process_data() sort_array() compare_elements() swap() memory_copy() allocate()

์œ„์˜ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Flame Graph์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค! ๋งˆ์น˜ ๋ถˆ๊ฝƒ์ด ํƒ€์˜ค๋ฅด๋Š” ๋“ฏํ•œ ๋ชจ์–‘์ด ๋ณด์ด์‹œ๋‚˜์š”? ๊ฐ๊ฐ์˜ ๋ง‰๋Œ€๋Š” ํ•จ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ง‰๋Œ€์˜ ๋„ˆ๋น„๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•œ CPU ์‹œ๊ฐ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์œ„๋กœ ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก ๋” ๊นŠ์€ ํ˜ธ์ถœ ์Šคํƒ์„ ๋‚˜ํƒ€๋‚ด์ฃ .

๐Ÿ’ก Flame Graph ํ•ด์„ ํŒ:

  • ๊ฐ€์žฅ ๋„“์€ ๋ง‰๋Œ€๋ฅผ ์ฐพ์œผ์„ธ์š”. ์ด๋Š” ๊ฐ€์žฅ ๋งŽ์€ CPU ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋Š” '๋ถˆ๊ฝƒ'์„ ๋”ฐ๋ผ๊ฐ€๋ณด์„ธ์š”. ์ด๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ์ƒ‰์ƒ์˜ ๋ณ€ํ™”์— ์ฃผ๋ชฉํ•˜์„ธ์š”. ์ด๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ Flame Graph๋Š” ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ ์žฌ๋Šฅ์˜ ์ธ๊ธฐ๋„์™€ ํ™œ์šฉ๋„๋ฅผ ํ•œ๋ˆˆ์— ๋ณด์—ฌ์ฃผ๋Š” ์ฐจํŠธ์™€ ๊ฐ™์•„์š”. ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ '์‹œ๊ฐ„'์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€, ์–ด๋–ค ๊ฒฝ๋กœ๋กœ ํ•จ์ˆ˜๋“ค์ด ํ˜ธ์ถœ๋˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ‘€

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” Flame Graph๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋ƒˆ์Šต๋‹ˆ๋‹ค! ๐ŸŽŠ ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋ณต์žกํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋„ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ํ•œ๋ˆˆ์— ๋น„๊ตํ•˜๊ณ  ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ .

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ๋งŒ๋“  Flame Graph๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์„ํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ณ„์†ํ•ด์„œ Flame Graphs์˜ ํฅ๋ฏธ์ง„์ง„ํ•œ ์„ธ๊ณ„๋กœ ํ•จ๊ป˜ ์—ฌํ–‰์„ ๋– ๋‚˜๋ณผ๊นŒ์š”? ๐Ÿš€

๐Ÿ” Flame Graphs ํ•ด์„ํ•˜๊ธฐ: ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๋น„๋ฐ€

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ฉ‹์ง„ Flame Graph๋ฅผ ๋งŒ๋“ค์–ด๋ƒˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•ด์„ํ•ด์•ผ ํ• ๊นŒ์š”? ๋งˆ์น˜ ๋ฏธ์ˆ ๊ด€์—์„œ ์ถ”์ƒํ™”๋ฅผ ๊ฐ์ƒํ•˜๋“ฏ, Flame Graph๋„ ์˜ฌ๋ฐ”๋ฅธ ํ•ด์„ ๋ฐฉ๋ฒ•์„ ์•Œ์•„์•ผ ๊ทธ ์ง„๊ฐ€๋ฅผ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ง€๊ธˆ๋ถ€ํ„ฐ Flame Graph ํ•ด์„์˜ ๋น„๋ฐ€์„ ํ•จ๊ป˜ ํŒŒํ—ค์ณ๋ณผ๊นŒ์š”? ๐Ÿ•ต๏ธโ€โ™€๏ธ๐Ÿ•ต๏ธโ€โ™‚๏ธ

1. ์ „์ฒด์ ์ธ ๋ชจ์–‘ ์‚ดํŽด๋ณด๊ธฐ

Flame Graph๋ฅผ ์ฒ˜์Œ ๋ดค์„ ๋•Œ, ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ ์ „์ฒด์ ์ธ ๋ชจ์–‘์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ํ›‘์–ด๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ !

๐Ÿ”ฅ Flame Graph ๋ชจ์–‘์˜ ์˜๋ฏธ:

  • ๋„“๊ณ  ๋‚ฎ์€ ๊ทธ๋ž˜ํ”„: ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์ด ์†Œ์ˆ˜์˜ ํ•จ์ˆ˜์— ์ง‘์ค‘๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์ข๊ณ  ๋†’์€ ๊ทธ๋ž˜ํ”„: ๋งŽ์€ ํ•จ์ˆ˜๋“ค์ด ํ˜ธ์ถœ๋˜์ง€๋งŒ, ๊ฐ๊ฐ์€ ์ ์€ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ๋ถˆ๊ทœ์น™ํ•œ ๋ชจ์–‘: ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜๋“ค์ด ๋‹ค์–‘ํ•œ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ Flame Graph๋ฅผ ํ•œ๋ฒˆ ์‚ดํŽด๋ณผ๊นŒ์š”?

๋‹ค์–‘ํ•œ ๋ชจ์–‘์˜ Flame Graph ์˜ˆ์‹œ main() process_A() process_B() sub_process_A1() sub_B1() sub_B2() sub_sub_A1() sub_sub_B2() leaf_A1()

์ด ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด, process_B() ํ•จ์ˆ˜๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋„“์€ ์˜์—ญ์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์–ด ๋งŽ์€ CPU ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, process_A() ํ•จ์ˆ˜๋Š” ๋” ๊นŠ์€ ํ˜ธ์ถœ ์Šคํƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด, ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ํ•˜์œ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

2. 'Hot' ์˜์—ญ ์‹๋ณ„ํ•˜๊ธฐ

'Hot' ์˜์—ญ์ด๋ž€ CPU ์‹œ๊ฐ„์„ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์„ ๋งํ•ฉ๋‹ˆ๋‹ค. Flame Graph์—์„œ๋Š” ๊ฐ€์žฅ ๋„“์€ ๋ง‰๋Œ€๊ฐ€ ๋ฐ”๋กœ ์ด 'Hot' ์˜์—ญ์ด ๋˜๊ฒ ์ฃ . ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ์ฐพ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”!

์œ„์˜ ์˜ˆ์‹œ์—์„œ process_B() ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ 'Hot' ์˜์—ญ์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋ฉด ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ํฐ ๋„์›€ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฃผ์˜ํ•  ์ ์€, ํ•ญ์ƒ ๊ฐ€์žฅ ๋„“์€ ๋ถ€๋ถ„๋งŒ ์ง‘์ค‘ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฑฐ์˜ˆ์š”. ๋•Œ๋กœ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋น„ํšจ์œจ์ ์ธ ๋ถ€๋ถ„๋“ค์ด ๋ชจ์—ฌ ํฐ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜๋„ ์žˆ๊ฑฐ๋“ ์š”.

3. ํ˜ธ์ถœ ์Šคํƒ ๋ถ„์„ํ•˜๊ธฐ

Flame Graph์˜ ์„ธ๋กœ์ถ•์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์Šคํƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์ง€์ฃ . ์ด๋ฅผ ํ†ตํ•ด ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ๊ฒฝ๋กœ๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ” ํ˜ธ์ถœ ์Šคํƒ ๋ถ„์„ ํŒ:

  • ๊ธด ์ˆ˜์ง ์Šคํƒ: ๊นŠ์€ ์žฌ๊ท€ ํ˜ธ์ถœ์ด๋‚˜ ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋„“์€ ๊ธฐ๋ฐ˜์˜ ์งง์€ ์Šคํƒ: ๋‹จ์ˆœํ•˜์ง€๋งŒ ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ๋ถˆ๊ทœ์น™ํ•œ ๋ชจ์–‘: ๋‹ค์–‘ํ•œ ๊ฒฝ๋กœ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋“ค์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ๊ทธ๋ž˜ํ”„์—์„œ process_A() โ†’ sub_process_A1() โ†’ sub_sub_A1() โ†’ leaf_A1()๋กœ ์ด์–ด์ง€๋Š” ๊ธด ํ˜ธ์ถœ ์Šคํƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ณต์žกํ•œ ๋กœ์ง์ด ์žˆ์Œ์„ ์‹œ์‚ฌํ•˜๋ฉฐ, ์ตœ์ ํ™”์˜ ๊ธฐํšŒ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์ƒ‰์ƒ ํ™œ์šฉํ•˜๊ธฐ

Flame Graph์—์„œ ์ƒ‰์ƒ์€ ๋‹จ์ˆœํžˆ ์‹œ๊ฐ์  ํšจ๊ณผ๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ƒ‰์ƒ์„ ํ†ตํ•ด ํ•จ์ˆ˜์˜ ์ข…๋ฅ˜๋‚˜ ๋ชจ๋“ˆ์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์ฃ .

์ผ๋ฐ˜์ ์œผ๋กœ ๋น„์Šทํ•œ ์ƒ‰์ƒ์€ ๊ฐ™์€ ๋ชจ๋“ˆ์ด๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์†ํ•œ ํ•จ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‹œ์Šคํ…œ ํ•จ์ˆ˜๋Š” ๋นจ๊ฐ„์ƒ‰, ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋Š” ์ฃผํ™ฉ์ƒ‰, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํŒŒ๋ž€์ƒ‰ ๋“ฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ‰์ƒ์œผ๋กœ ๊ตฌ๋ถ„๋œ Flame Graph ์˜ˆ์‹œ main() external_library() user_defined() system_call()

์ด๋ ‡๊ฒŒ ์ƒ‰์ƒ์„ ํ™œ์šฉํ•˜๋ฉด, ์–ด๋–ค ๋ถ€๋ถ„์—์„œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋” ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋„ˆ๋ฌด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜๋Š”์ง€, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ๋งŽ์€ ์‹œ๊ฐ„์„ ์ฐจ์ง€ํ•˜๋Š”์ง€ ๋“ฑ์„ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์ฃ .

5. ์‹ค์ œ ์ตœ์ ํ™”์— ์ ์šฉํ•˜๊ธฐ

Flame Graph๋ฅผ ํ•ด์„ํ–ˆ๋‹ค๋ฉด, ์ด์ œ ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋ช‡ ๊ฐ€์ง€ ํŒ์„ ์†Œ๊ฐœํ•ด๋“œ๋ฆด๊ฒŒ์š”:

  • ๊ฐ€์žฅ ๋„“์€ ๋ง‰๋Œ€ ์ตœ์ ํ™”ํ•˜๊ธฐ: CPU ์‹œ๊ฐ„์„ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋ถ€ํ„ฐ ์ตœ์ ํ™”๋ฅผ ์‹œ์ž‘ํ•˜์„ธ์š”.
  • ๊นŠ์€ ํ˜ธ์ถœ ์Šคํƒ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ: ๋„ˆ๋ฌด ๊นŠ์€ ํ˜ธ์ถœ ์Šคํƒ์€ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋กœ์ง์„ ๋‹จ์ˆœํ™”ํ•ด๋ณด์„ธ์š”.
  • ๋ฐ˜๋ณต๋˜๋Š” ํŒจํ„ด ์ฐพ๊ธฐ: ๋น„์Šทํ•œ ํŒจํ„ด์ด ์ž์ฃผ ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด, ๊ณตํ†ต ๋กœ์ง์„ ์ถ”์ถœํ•˜์—ฌ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ตœ์†Œํ™”ํ•˜๊ธฐ: ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๋น„์šฉ์ด ํฝ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ฒ„ํผ๋ง์ด๋‚˜ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ ํšŸ์ˆ˜๋ฅผ ์ค„์ด์„ธ์š”.

๐Ÿ’ก ์ตœ์ ํ™” ์‚ฌ๋ก€:

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ Flame Graph์—์„œ process_B() ํ•จ์ˆ˜๊ฐ€ ๋งŽ์€ ์‹œ๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์ด ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ ๋กœ์ง์„ ๊ฒ€ํ† ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐœ์„ ํ•˜๋Š” ๋“ฑ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Flame Graph๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ์ฐพ์•„ ๊ทธ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„์„ ๊ฐœ์„ ํ•จ์œผ๋กœ์จ, ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ฃ !

๊ฒฐ๋ก : Flame Graphs, ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๊ฐ•๋ ฅํ•œ ๋™๋ฐ˜์ž

Flame Graphs๋Š” ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ์‹œ๊ฐํ™”ํ•˜๊ณ  ์ดํ•ดํ•˜๋Š” ๋ฐ ์žˆ์–ด ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์ด ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ํ•œ๋ˆˆ์— ๋ณด์—ฌ์ฃผ๋“ฏ, Flame Graphs๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ ํŠน์„ฑ์„ ์ง๊ด€์ ์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ธฐ์–ตํ•˜์„ธ์š”, Flame Graph๋Š” ๋„๊ตฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ง„์ •ํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ํ†ต์ฐฐ๋ ฅ๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ , ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด์—์„œ ๋น„๋กฏ๋ฉ๋‹ˆ๋‹ค. Flame Graph๋Š” ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ์ตœ์ ํ™”์˜ ๋ฐฉํ–ฅ์„ ์ œ์‹œํ•ด์ฃผ๋Š” ๋‚˜์นจ๋ฐ˜ ์—ญํ• ์„ ํ•  ๋ฟ์ด์ฃ .

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ Flame Graphs์˜ ์„ธ๊ณ„๋ฅผ ํƒํ—˜ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ๐Ÿš€ ๋ณต์žกํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋„ ์ด์ œ ๋‘๋ ต์ง€ ์•Š์ฃ ? Flame Graphs์™€ ํ•จ๊ป˜๋ผ๋ฉด, ์–ด๋–ค ์„ฑ๋Šฅ ์ด์Šˆ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ์— Flame Graphs๋ฅผ ์ ์šฉํ•ด๋ณด์„ธ์š”. ๋†€๋ผ์šด ๋ฐœ๊ฒฌ์ด ์—ฌ๋Ÿฌ๋ถ„์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

๐ŸŒŸ Flame Graphs์˜ ๋ฏธ๋ž˜: ์ƒˆ๋กœ์šด ์ง€ํ‰์„ ์—ด๋‹ค

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” Flame Graphs์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์ œ ์ ์šฉ ๋ฐฉ๋ฒ•๊นŒ์ง€ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์ˆ ์˜ ์„ธ๊ณ„๋Š” ํ•ญ์ƒ ์ง„ํ™”ํ•˜๊ณ  ์žˆ์ฃ . Flame Graphs๋„ ์˜ˆ์™ธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ Flame Graphs์˜ ๋ฏธ๋ž˜, ๊ทธ๋ฆฌ๊ณ  ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ํ•ด ๋‚˜๊ฐˆ์ง€ ํ•จ๊ป˜ ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿ”ฎ

1. ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๊ฒฐํ•ฉ

๋ฏธ๋ž˜์˜ Flame Graphs๋Š” ์‹ค์‹œ๊ฐ„ ์‹œ์Šคํ…œ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๋”์šฑ ๊ธด๋ฐ€ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ธ๊ธฐ ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ์ถ”์ ํ•˜๋“ฏ์ด, ๊ฐœ๋ฐœ์ž๋“ค์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” Flame Graphs๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ๋ณ€ํ™”๋ฅผ ์ฆ‰๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”.

๐Ÿš€ ์‹ค์‹œ๊ฐ„ Flame Graphs์˜ ์žฅ์ :

  • ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ์ฆ‰์‹œ ๊ฐ์ง€ํ•˜๊ณ  ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ์˜ํ–ฅ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฅ๊ธฐ์ ์ธ ์„ฑ๋Šฅ ํŠธ๋ Œ๋“œ๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋จธ์‹ ๋Ÿฌ๋‹๊ณผ์˜ ํ†ตํ•ฉ

์ธ๊ณต์ง€๋Šฅ๊ณผ ๋จธ์‹ ๋Ÿฌ๋‹์˜ ๋ฐœ์ „์€ Flame Graphs์—๋„ ์ƒˆ๋กœ์šด ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด Flame Graphs๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ž๋™์œผ๋กœ ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ตœ์ ํ™” ๋ฐฉ์•ˆ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, AI๊ฐ€ ๊ณผ๊ฑฐ์˜ ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ์™€ ํ˜„์žฌ์˜ Flame Graph๋ฅผ ๋น„๊ต๋ถ„์„ํ•˜์—ฌ ๋น„์ •์ƒ์ ์ธ ํŒจํ„ด์„ ์ฐพ์•„๋‚ด๊ณ , ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ AI๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์ทจํ–ฅ์„ ๋ถ„์„ํ•ด ์ตœ์ ์˜ ์„œ๋น„์Šค๋ฅผ ์ถ”์ฒœํ•ด์ฃผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ !

3. 3D Flame Graphs

ํ˜„์žฌ์˜ 2D Flame Graphs์—์„œ ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€, 3D Flame Graphs๊ฐ€ ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ํ•œ ๋ฒˆ์— ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์ฃ .

3D Flame Graph ๊ฐœ๋…๋„ ์‹œ๊ฐ„ CPU ์‚ฌ์šฉ๋Ÿ‰ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰

3D Flame Graphs์—์„œ๋Š” X์ถ•์— CPU ์‚ฌ์šฉ๋Ÿ‰, Y์ถ•์— ํ˜ธ์ถœ ์Šคํƒ ๊นŠ์ด, Z์ถ•์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋“ฑ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋“ค์€ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋”์šฑ ์ž…์ฒด์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”.

4. ํ˜‘์—… ๋„๊ตฌ์™€์˜ ํ†ตํ•ฉ

๋ฏธ๋ž˜์˜ Flame Graphs๋Š” ๋‹ค์–‘ํ•œ ํ˜‘์—… ๋„๊ตฌ์™€ ํ†ตํ•ฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Flame Graphs์—์„œ ๋ฐœ๊ฒฌ๋œ ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ์ง์ ‘ ์ด์Šˆ ํŠธ๋ž˜์ปค์— ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์„ฑ๋Šฅ ๊ด€๋ จ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.

๐Ÿ’ก ํ˜‘์—… ํ†ตํ•ฉ์˜ ์ด์ :

  • ์„ฑ๋Šฅ ์ด์Šˆ์˜ ์ถ”์ ๊ณผ ํ•ด๊ฒฐ ๊ณผ์ •์„ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŒ€ ์ „์ฒด๊ฐ€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ค‘์š”์„ฑ์„ ๊ณต์œ ํ•˜๊ณ  ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ๊ฐœ์„ ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ช…ํ™•ํžˆ ์‹œ๊ฐํ™”ํ•˜์—ฌ ํŒ€์˜ ์„ฑ๊ณผ๋ฅผ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ฐ ๋‹ค์ค‘ ์–ธ์–ด ์ง€์›

์•ž์œผ๋กœ Flame Graphs๋Š” ๋” ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์ด ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์˜ ์žฌ๋Šฅ์„ ์•„์šฐ๋ฅด๋“ฏ, Flame Graphs๋„ ๋ชจ๋“  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค๋Š” ์˜๋ฏธ์ฃ .

์˜ˆ๋ฅผ ๋“ค์–ด, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ, ๋ชจ๋ฐ”์ผ ์•ฑ, ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„ ์‹œ์Šคํ…œ๊นŒ์ง€ ๋ชจ๋‘ ์•„์šฐ๋ฅด๋Š” ํ†ตํ•ฉ Flame Graphs๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋“ค์€ ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ์ข…ํ•ฉ์ ์œผ๋กœ ๋ถ„์„ํ•˜๊ณ  ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์ฃ .

๊ฒฐ๋ก : ๋์—†๋Š” ๊ฐ€๋Šฅ์„ฑ์˜ ์„ธ๊ณ„

Flame Graphs์˜ ๋ฏธ๋ž˜๋Š” ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•ฉ๋‹ˆ๋‹ค! ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง, AI์™€์˜ ๊ฒฐํ•ฉ, 3D ์‹œ๊ฐํ™”, ํ˜‘์—… ๋„๊ตฌ์™€์˜ ํ†ตํ•ฉ, ๊ทธ๋ฆฌ๊ณ  ๋” ๋„“์€ ํ”Œ๋žซํผ ์ง€์›๊นŒ์ง€. ์ด ๋ชจ๋“  ๋ฐœ์ „์€ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์šฉํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์ด ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ๊ณผ ์„œ๋น„์Šค๋ฅผ ๋ฐœ๊ตดํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋“ฏ์ด, Flame Graphs๋„ ๊ณ„์†ํ•ด์„œ ์ง„ํ™”ํ•˜๋ฉฐ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์˜ ์ƒˆ๋กœ์šด ์ง€ํ‰์„ ์—ด์–ด๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ƒ์ƒํ•˜์ง€ ๋ชปํ•œ ์ƒˆ๋กœ์šด ํ™œ์šฉ ๋ฐฉ๋ฒ•๊ณผ ๊ฐ€๋Šฅ์„ฑ์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฅด์ฃ !

์—ฌ๋Ÿฌ๋ถ„๋„ ์ด ํฅ๋ฏธ์ง„์ง„ํ•œ ์—ฌ์ •์— ๋™์ฐธํ•ด๋ณด์‹œ๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? Flame Graphs์˜ ๋ฏธ๋ž˜๋ฅผ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด๊ฐ€๋Š” ์ฃผ์ธ๊ณต์ด ๋˜์–ด๋ณด์„ธ์š”. ๋ˆ„๊ฐ€ ์•Œ๊ฒ ์–ด์š”? ์—ฌ๋Ÿฌ๋ถ„์˜ ์•„์ด๋””์–ด๊ฐ€ ๋‹ค์Œ ์„ธ๋Œ€์˜ Flame Graphs๋ฅผ ํƒ„์ƒ์‹œํ‚ฌ์ง€๋„ ๋ชจ๋ฅด๋‹ˆ๊นŒ์š”! ๐ŸŒŸ

์ž, ์ด๋ ‡๊ฒŒ ํ•ด์„œ ์šฐ๋ฆฌ๋Š” Flame Graphs์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์ œ ์ ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜์˜ ๊ฐ€๋Šฅ์„ฑ๊นŒ์ง€ ํญ๋„“๊ฒŒ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. Flame Graphs๋Š” ๋‹จ์ˆœํ•œ ์„ฑ๋Šฅ ๋ถ„์„ ๋„๊ตฌ๋ฅผ ๋„˜์–ด, ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์˜ ํ•„์ˆ˜์ ์ธ ๋™๋ฐ˜์ž๋กœ ์ž๋ฆฌ์žก์•„๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ตœ์ ํ™”ํ•˜๊ณ , ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋„์ „ํ•ด๋ณด์„ธ์š”. ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์„ธ๊ณ„์—์„œ ์—ฌ๋Ÿฌ๋ถ„์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ๋ฌดํ•œํ•œ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๐Ÿš€๐Ÿ”ฅ
๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.