{"id":254,"date":"2024-04-22T02:13:00","date_gmt":"2024-04-21T17:13:00","guid":{"rendered":"https:\/\/redutan.synology.me\/wordpress\/?p=254"},"modified":"2024-04-23T18:41:51","modified_gmt":"2024-04-23T09:41:51","slug":"virtual-thread-pinning-issue%ec%9e%91%ec%84%b1-%ec%a4%91","status":"publish","type":"post","link":"https:\/\/redutan.synology.me\/wordpress\/2024\/04\/22\/virtual-thread-pinning-issue%ec%9e%91%ec%84%b1-%ec%a4%91\/","title":{"rendered":"Virtual Thread Pinning Issue"},"content":{"rendered":"\n<h2>\bISSUE: Pinning inside synchronized<\/h2>\n\n\n\n<p><br>\ub300\ubd80\ubd84\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 RDB\ub97c \ud1b5\ud574\uc11c \uc601\uc18d\ud654 \ud569\ub2c8\ub2e4. \uc81c\uac00 \uad00\ub9ac\ud558\ub294 \uc11c\ube44\uc2a4 \uacbd\uc6b0\uc5d0\ub294 \bMySQL \ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ub300\ubd80\ubd84\uc758 jdbc-driver \ucf54\ub4dc \ub0b4\uc5d0\ub294 \ub3d9\uc2dc\uc131 \uc774\uc288\ub97c \ucc98\ub9ac\ud558\uae30 \uc704\ud574\uc11c <code>synchronized<\/code> \ub97c \uc774\uc6a9\ud574\uc11c \uad6c\ud604\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uac83 \ub54c\ubb38\uc5d0 Carrier Thread\uc5d0\uc11c lock\uc774 \uac78\ub9ac\ub294 \uc77c\uba85 pinning(\uace0\uc815) \uc774\uc288\uac00 \uc788\uc73c\uba70, \uc774\uac83 \ub54c\ubb38\uc5d0 \uc131\ub2a5 \uc800\ud558\uac00 \ud07d\ub2c8\ub2e4.<br><br>\ub300\ud45c\ub85c jdbc-driver\ub97c \uc608\ub85c \ub4e4\uae34 \ud588\uc9c0\ub9cc jdbc-driver \ub9cc\uc758 \ubb38\uc81c\ub294 \uc544\ub2d9\ub2c8\ub2e4. \uae30\uc874 \ub808\uac70\uc2dc \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c <code>synchronized<\/code> \ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 \ub2e4 \ubb38\uc81c\uac00 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\ud589\ud788 Spring \uc5d0\uc11c\ub294 \uc774 \ubb38\uc81c\ub97c \ub300\ubd80\ubd84 \ud574\uacb0\ud55c \ubc84\uc804\uc774 \ub9b4\ub9ac\uc988 \ub410\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h3>Pinning Issue on Virtual Thread<\/h3>\n\n\n\n<p>Pinning \uc774\uc288\uc5d0\uc11c \ub300\ud574\uc11c \uac04\ub2e8\ud558\uac8c \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uba3c\uc800 Virtual Thread\uc5d0 \ub300\ud55c \uad6c\uc870\ub97c \uc54c\uc544\uc57c\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\/\/ TODO \uc774\uac70 \uc81c\ub300\ub85c \uc791\uc131\ud574\uc57c\ud558\ub294\ub370 \uadc0\ucc2e\uc74c. \uc815\ub9ac\uac00 \uc798 \ub41c \ub2e4\ub978 \ube14\ub85c\uadf8 \uae00\uc744 \ub9c1\ud06c\ud560\uae4c \uace0\ubbfc \uc911&#8230;<\/p>\n\n\n\n<h3>Pinning Solution<\/h3>\n\n\n\n<p>\ud574\uacb0\ucc45\uc740 \uc758\uc678\ub85c \uac04\ub2e8\ud569\ub2c8\ub2e4. synchronized -&gt; <code>ReteerantLock<\/code> \ub85c \ubcc0\uacbd\ud558\uba74 \ub05d\uc774\uc8e0.<\/p>\n\n\n\n<h3>MySQL Driver<\/h3>\n\n\n\n<p>mysql\uc5d0\uc11c \uc774\ubbf8 \ub300\uc751 \uc911\uc774\uba70, MySQL Connector\/J(jdbc-driver) 9.0 \ubc84\uc804\uc5d0\uc11c \ud574\uacb0\ub420 \uc608\uc815\uc774\ub77c\uace0 \ud569\ub2c8\ub2e4.<br>\ucc38\uace0: <a href=\"https:\/\/bugs.mysql.com\/bug.php?id=110512\">https:\/\/bugs.mysql.com\/bug.php?id=110512<\/a><\/p>\n\n\n\n<p>\uc5ec\ub7ec\ubd84\ub4e4\ub3c4 \uc0ac\uc6a9\ud558\uc2dc\ub294 jdbc-driver\ub098 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc758 \ub9b4\ub9ac\uc988 \ub178\ud2b8 \ub610\ub294 \ucf54\ub4dc\ub97c \ud655\uc778\ud558\uc2dc\uae38 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3>MariaDB Driver<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/mariadb.com\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2023\/12\/jdbc-connector-virtual-threads-blog-img3.png.webp\" alt=\"\"\/><figcaption class=\"wp-element-caption\">MariaDB vs MySQL OPS by virtual thread, platform thread Graph<\/figcaption><\/figure>\n\n\n\n<p>mysql \uc0ac\ucd0c \ubed8\uc778 MariaDB\uc758 \uacbd\uc6b0\uc5d0\ub294 \ubc8c\uc368 Virtual Thread\ub97c <a href=\"https:\/\/mariadb.com\/kb\/en\/mariadb-connector-j-3-3-0-release-notes\/\" target=\"_blank\" rel=\"noreferrer noopener\">MariaDB Java connector 3.3.0<\/a> \uc801\uc6a9\ud588\ub124\uc694.<br>\uac70\uae30\uc5d0 <a href=\"https:\/\/mariadb.com\/resources\/blog\/benchmark-jdbc-connectors-and-java-21-virtual-threads\/\">https:\/\/mariadb.com\/resources\/blog\/benchmark-jdbc-connectors-and-java-21-virtual-threads\/<\/a> \ube14\ub85c\uadf8\uc5d0 \ubca4\uce58\ub9c8\ud06c \uc815\ubcf4\uae4c\uc9c0 \ubcf4\uc5ec\uc8fc\ub294\uad70\uc694.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>\ud798\ub0b4\ub77c MySQL!!!<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/img.animalplanet.co.kr\/news\/2019\/10\/07\/700\/75fs0fm6pz3m361hvj1u.jpg\" alt=\"\" width=\"424\" height=\"242\"\/><figcaption class=\"wp-element-caption\">\ucd9c\ucc98: https:\/\/m.animalplanet.co.kr\/contents\/?artNo=3749<\/figcaption><\/figure>\n<\/blockquote>\n\n\n\n<p><\/p>\n\n\n\n<h2>\uc544\uc9c1\uc740 \uc2dc\uae30\uc0c1\uc870?<\/h2>\n\n\n\n<p>\ud558\uc9c0\ub9cc non-blocking \uae30\ubc18\uc73c\ub85c \uad6c\ud604\ub41c driver(ex: MariaDB)\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 Virtual Thread\ub97c \uae0d\uc815\uc801\uc73c\ub85c \uac80\ud1a0\ud574 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8 \uc678 \uc544\ub798\uc640 \uac19\uc740 \uacbd\uc6b0 \uc88b\ub2e4\uace0 \ubd05\ub2c8\ub2e4.<\/p>\n\n\n\n<ol>\n<li>Edge \uc11c\ube44\uc2a4(Api Gateway)<\/li>\n\n\n\n<li>\ucc98\ub9ac\ub7c9\uc774 \uc911\uc694\ud55c \uc11c\ube44\uc2a4: \ub2e8, Latency\ub294 \uc880 \ubd80\uc871\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7fc\uc5d0\ub3c4 \ub9ac\uc18c\uc2a4 \ub300\ube44 \ucc98\ub9ac\ub7c9\uc740 \uc6b0\uc218\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n\n\n\n<p>\uc774\ubbf8 Java \ucee4\ubba4\ub2c8\ud2f0\uc5d0\uc11c\ub294 <code>synchronized<\/code> \uc9c0\uc2dc\uc5b4 \ub97c \ub9ce\uc774 \uc81c\uac70\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc81c\uac00 \ubd24\uc744 \ub54c\ub294 \uc2dc\uac04\uc758 \ubb38\uc81c\ub77c\uace0 \ubcf4\uace0 \uc788\uc73c\uba70, \uc774\uc81c \ud0c0 \ud50c\ub7ab\ud3fc\uc758 \uacbd\ub7c9 \uc2a4\ub808\ub4dc(\uace0\ub8e8\ud2f4, \ucf54\ub8e8\ud2f4)\ub97c \uae30\uc874 Thread \ubaa8\ub378 \uae30\ubc18 \ucf54\ub4dc \ubca0\uc774\uc2a4\uc5d0\uc11c \ud3b8\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc2dc\ub300\uac00 \uace7 \ub2e4\uac00\uc62c \uac70\ub77c\uace0 \ubd05\ub2c8\ub2e4.<br><br>\ucd94\uac00\ub85c <a href=\"https:\/\/openjdk.org\/jeps\/425\" target=\"_blank\" rel=\"noopener\" title=\"\">JEP 425: Virtual Threads (Preview)<\/a> \uc5d0\uc11c \ucd94\ud6c4 Pinning \uc774\uc288\ub97c \ud68c\ud53c\ud560 \uc218 \uc788\ub2e4\uace0 \ud588\uc2b5\ub2c8\ub2e4. \uc774\uac8c \ub41c\ub2e4\uba74 \uae30\uc874 \ub808\uac70\uc2dc \ub77c\uc774\ube0c\ub7ec\ub9ac \uc0c1\uc5d0\uc11c\ub3c4 \ud3b8\ud558\uac8c Virtual Thread\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub124\uc694. (\ud558\uc9c0\ub9cc <code>native<\/code> \ud638\ucd9c\uc5d0 \ub300\ud574\uc11c\ub294 \uc81c\uc57d\uc740 \uc720\uc9c0\ud55c\ub2e4\uace0 \ud558\ub124\uc694)<\/p>\n\n\n\n<p><em>JEP-425 \uc77c\ubd80 \ubc1c\ucdcc<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\n 1. When it executes code inside a synchronized block or method, or\n 2. When it executes a native method or a foreign function.\n...\nIn a future release, we may be able to remove the first limitation above (pinning inside synchronized). The second limitation is required for proper interaction with native code.<\/code><\/pre>\n\n\n\n<h2>\uadf8\ub798\uc11c \uc6b0\ub9ac\uac00 \ud560 \uc218 \uc788\ub294 \uac83\uc740?<\/h2>\n\n\n\n<ul>\n<li>\uacf5\uc720 \uc790\uc6d0 \ub3d9\uc2dc\uc131 \uc81c\uc5b4\uac00 \ud544\uc694\ud558\uba74 <code>synchronized<\/code> \ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 <code>ReentrantLock<\/code>\uc744 \uc0ac\uc6a9.<\/li>\n\n\n\n<li>\uc0ac\uc6a9\ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0 Pinning \uc774\uc288\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud558\uae30(\ubaa8\ub4e0 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc77c\uc77c\uc774 \ucc3e\uae30\ub294 \ud798\ub4dc\ub2c8 \uc131\ub2a5\ud14c\uc2a4\ud2b8 \ucd94\ucc9c)<br><code>-Djdk.tracePinnedThreads=full<\/code> or s<code>hort<\/code> JVM \uc635\uc158\uc73c\ub85c Pinning \uc774\uc288 \ucd94\uc801 \uac00\ub2a5<\/li>\n\n\n\n<li><strong>\uae30\ub2e4\ub9b0\ub2e4<\/strong> &#8211; \uc5b8\uc820\uac00 Java \ucee4\ubba4\ub2c8\ud2f0\uc5d0\uc11c \ub2e4 \ud574\uacb0\ud574 \uc904 \uac81\ub2c8\ub2e4.-<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\bISSUE: Pinning inside synchronized \ub300\ubd80\ubd84\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 RDB\ub97c \ud1b5\ud574\uc11c \uc601\uc18d\ud654 \ud569\ub2c8\ub2e4. \uc81c\uac00 \uad00\ub9ac\ud558\ub294 \uc11c\ube44\uc2a4 \uacbd\uc6b0\uc5d0\ub294 \bMySQL \ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ub300\ubd80\ubd84\uc758 jdbc-driver \ucf54\ub4dc \ub0b4\uc5d0\ub294 \ub3d9\uc2dc\uc131 \uc774\uc288\ub97c \ucc98\ub9ac\ud558\uae30 \uc704\ud574\uc11c synchronized \ub97c \uc774\uc6a9\ud574\uc11c \uad6c\ud604\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uac83 \ub54c\ubb38\uc5d0 Carrier Thread\uc5d0\uc11c lock\uc774 \uac78\ub9ac\ub294 \uc77c\uba85 pinning(\uace0\uc815) \uc774\uc288\uac00 \uc788\uc73c\uba70, \uc774\uac83 \ub54c\ubb38\uc5d0 \uc131\ub2a5 \uc800\ud558\uac00 \ud07d\ub2c8\ub2e4. \ub300\ud45c\ub85c jdbc-driver\ub97c \uc608\ub85c \ub4e4\uae34 \ud588\uc9c0\ub9cc jdbc-driver \ub9cc\uc758 \ubb38\uc81c\ub294 \uc544\ub2d9\ub2c8\ub2e4. &#8230; <a title=\"Virtual Thread Pinning Issue\" class=\"read-more\" href=\"https:\/\/redutan.synology.me\/wordpress\/2024\/04\/22\/virtual-thread-pinning-issue%ec%9e%91%ec%84%b1-%ec%a4%91\/\" aria-label=\"Read more about Virtual Thread Pinning Issue\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[28],"tags":[40,41,39],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/posts\/254"}],"collection":[{"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/comments?post=254"}],"version-history":[{"count":13,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/posts\/254\/revisions"}],"predecessor-version":[{"id":308,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/posts\/254\/revisions\/308"}],"wp:attachment":[{"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/media?parent=254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/categories?post=254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/tags?post=254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}