ಪ್ರೊಹೋಸ್ಟರ್ > Блог > ಆಡಳಿತ > Async, Swoole ಮತ್ತು Parallel ಅನ್ನು ಬಳಸಿಕೊಂಡು Tarantool ಗಾಗಿ PHP ಕನೆಕ್ಟರ್ಗಳನ್ನು ವೇಗಗೊಳಿಸುವುದು
Async, Swoole ಮತ್ತು Parallel ಅನ್ನು ಬಳಸಿಕೊಂಡು Tarantool ಗಾಗಿ PHP ಕನೆಕ್ಟರ್ಗಳನ್ನು ವೇಗಗೊಳಿಸುವುದು
PHP ಪರಿಸರ ವ್ಯವಸ್ಥೆಯಲ್ಲಿ ಪ್ರಸ್ತುತ Tarantool ಸರ್ವರ್ನೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು ಎರಡು ಕನೆಕ್ಟರ್ಗಳಿವೆ - ಇದು ಅಧಿಕೃತ PECL ವಿಸ್ತರಣೆಯಾಗಿದೆ tarantool/tarantool-php, C ನಲ್ಲಿ ಬರೆಯಲಾಗಿದೆ, ಮತ್ತು tarantool-php/ಕ್ಲೈಂಟ್, PHP ನಲ್ಲಿ ಬರೆಯಲಾಗಿದೆ. ನಾನು ನಂತರದ ಲೇಖಕ.
ಈ ಲೇಖನದಲ್ಲಿ, ನಾನು ಎರಡೂ ಗ್ರಂಥಾಲಯಗಳ ಕಾರ್ಯಕ್ಷಮತೆಯ ಪರೀಕ್ಷೆಯ ಫಲಿತಾಂಶಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಬಯಸುತ್ತೇನೆ ಮತ್ತು ಕೋಡ್ಗೆ ಕನಿಷ್ಠ ಬದಲಾವಣೆಗಳೊಂದಿಗೆ, ನೀವು 3-5 ಕಾರ್ಯಕ್ಷಮತೆಯ ಹೆಚ್ಚಳವನ್ನು ಹೇಗೆ ಸಾಧಿಸಬಹುದು ಎಂಬುದನ್ನು ತೋರಿಸಲು ಬಯಸುತ್ತೇನೆ (ಸಂಶ್ಲೇಷಿತ ಪರೀಕ್ಷೆಗಳಲ್ಲಿ!).
ನಾವು ಏನು ಪರೀಕ್ಷಿಸುತ್ತೇವೆ?
ನಾವು ಮೇಲೆ ತಿಳಿಸಿದವರನ್ನು ಪರೀಕ್ಷಿಸುತ್ತೇವೆ ಸಿಂಕ್ರೊನಸ್ ಕನೆಕ್ಟರ್ಗಳು ಅಸಮಕಾಲಿಕವಾಗಿ, ಸಮಾನಾಂತರವಾಗಿ ಮತ್ತು ಅಸಮಕಾಲಿಕವಾಗಿ-ಸಮಾನಾಂತರವಾಗಿ ಚಲಿಸುತ್ತವೆ. 🙂 ನಾವು ಕನೆಕ್ಟರ್ಗಳ ಕೋಡ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಲು ಬಯಸುವುದಿಲ್ಲ. ನಿಮಗೆ ಬೇಕಾದುದನ್ನು ಸಾಧಿಸಲು ಪ್ರಸ್ತುತ ಹಲವಾರು ವಿಸ್ತರಣೆಗಳು ಲಭ್ಯವಿದೆ:
ಸ್ವೂಲ್ PHP ಗಾಗಿ ಹೆಚ್ಚಿನ ಕಾರ್ಯಕ್ಷಮತೆಯ ಅಸಮಕಾಲಿಕ ಚೌಕಟ್ಟು. ಅಲಿಬಾಬಾ ಮತ್ತು ಬೈದು ಅಂತಹ ಇಂಟರ್ನೆಟ್ ದೈತ್ಯರು ಬಳಸುತ್ತಾರೆ. ಆವೃತ್ತಿ 4.1.0 ರಿಂದ ಮ್ಯಾಜಿಕ್ ವಿಧಾನವು ಕಾಣಿಸಿಕೊಂಡಿದೆ ಸ್ವೂಲ್ ರನ್ಟೈಮ್:: ಎನೇಬಲ್ ಕೊರೊಟಿನ್(), ಇದು "ಸಿಂಕ್ರೊನಸ್ PHP ನೆಟ್ವರ್ಕ್ ಲೈಬ್ರರಿಗಳನ್ನು ಒಂದು ಸಾಲಿನ ಕೋಡ್ನೊಂದಿಗೆ ಅಸಮಕಾಲಿಕವಾಗಿ ಪರಿವರ್ತಿಸಲು" ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ.
Async ಇತ್ತೀಚಿನವರೆಗೂ PHP ಯಲ್ಲಿ ಅಸಮಕಾಲಿಕ ಕೆಲಸಕ್ಕಾಗಿ ಬಹಳ ಭರವಸೆಯ ವಿಸ್ತರಣೆಯಾಗಿತ್ತು. ಇತ್ತೀಚಿನವರೆಗೂ ಏಕೆ? ದುರದೃಷ್ಟವಶಾತ್, ನನಗೆ ತಿಳಿದಿಲ್ಲದ ಕಾರಣಕ್ಕಾಗಿ, ಲೇಖಕನು ರೆಪೊಸಿಟರಿಯನ್ನು ಅಳಿಸಿದ್ದಾನೆ ಮತ್ತು ಯೋಜನೆಯ ಭವಿಷ್ಯದ ಭವಿಷ್ಯವು ಅಸ್ಪಷ್ಟವಾಗಿದೆ. ನಾನು ಅದನ್ನು ಬಳಸಬೇಕಾಗುತ್ತದೆ ಒಂದು ಫೋರ್ಕ್ಸ್ನಿಂದ. ಸ್ವೂಲ್ನಂತೆ, TCP ಮತ್ತು TLS ಸ್ಟ್ರೀಮ್ಗಳ ಪ್ರಮಾಣಿತ ಅನುಷ್ಠಾನವನ್ನು ಅವುಗಳ ಅಸಮಕಾಲಿಕ ಆವೃತ್ತಿಗಳೊಂದಿಗೆ ಬದಲಾಯಿಸುವ ಮೂಲಕ ಅಸಮಕಾಲಿಕತೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಮಣಿಕಟ್ಟಿನ ಫ್ಲಿಕ್ನೊಂದಿಗೆ ನಿಮ್ಮ ಪ್ಯಾಂಟ್ ಅನ್ನು ಸುಲಭವಾಗಿ ಆನ್ ಮಾಡಲು ಈ ವಿಸ್ತರಣೆಯು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದನ್ನು ಆಯ್ಕೆಯ ಮೂಲಕ ಮಾಡಲಾಗುತ್ತದೆ "async.tcp = 1".
ಸಮಾನಾಂತರ ― phpdbg, apcu, pthreads, pcov, uopz ನಂತಹ ಗ್ರಂಥಾಲಯಗಳ ಲೇಖಕರಾದ ಪ್ರಸಿದ್ಧ ಜೋ ವಾಟ್ಕಿನ್ಸ್ ಅವರಿಂದ ಸಾಕಷ್ಟು ಹೊಸ ವಿಸ್ತರಣೆ. ವಿಸ್ತರಣೆಯು PHP ಯಲ್ಲಿ ಮಲ್ಟಿಥ್ರೆಡಿಂಗ್ಗಾಗಿ API ಅನ್ನು ಒದಗಿಸುತ್ತದೆ ಮತ್ತು pthreads ಗೆ ಬದಲಿಯಾಗಿ ಇರಿಸಲಾಗಿದೆ. ಲೈಬ್ರರಿಯ ಗಮನಾರ್ಹ ಮಿತಿಯೆಂದರೆ ಅದು PHP ಯ ZTS (ಜೆಂಡ್ ಥ್ರೆಡ್ ಸೇಫ್) ಆವೃತ್ತಿಯೊಂದಿಗೆ ಮಾತ್ರ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ.
ನಾವು ಹೇಗೆ ಪರೀಕ್ಷಿಸುತ್ತೇವೆ?
ಟ್ಯಾರಂಟೂಲ್ ನಿದರ್ಶನವನ್ನು ಬರೆಯಲು-ಮುಂದೆ ಲಾಗಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸೋಣ (wal_mode = ಯಾವುದೂ ಇಲ್ಲ) ಮತ್ತು ಹೆಚ್ಚಿದ ನೆಟ್ವರ್ಕ್ ಬಫರ್ (readahead = 1 * 1024 * 1024) ಮೊದಲ ಆಯ್ಕೆಯು ಡಿಸ್ಕ್ನೊಂದಿಗೆ ಕೆಲಸವನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ, ಎರಡನೆಯದು ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ ಬಫರ್ನಿಂದ ಹೆಚ್ಚಿನ ವಿನಂತಿಗಳನ್ನು ಓದಲು ಸಾಧ್ಯವಾಗಿಸುತ್ತದೆ ಮತ್ತು ಇದರಿಂದಾಗಿ ಸಿಸ್ಟಮ್ ಕರೆಗಳ ಸಂಖ್ಯೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ.
ಡೇಟಾದೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವ ಮಾನದಂಡಗಳಿಗೆ (ಅಳವಡಿಕೆ, ಅಳಿಸುವಿಕೆ, ಓದುವಿಕೆ, ಇತ್ಯಾದಿ), ಮಾನದಂಡವನ್ನು ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು, ಒಂದು memtx ಜಾಗವನ್ನು (ಮರು) ರಚಿಸಲಾಗುತ್ತದೆ, ಇದರಲ್ಲಿ ಪ್ರಾಥಮಿಕ ಸೂಚ್ಯಂಕ ಮೌಲ್ಯಗಳನ್ನು ಆದೇಶದ ಪೂರ್ಣಾಂಕ ಮೌಲ್ಯಗಳ ಜನರೇಟರ್ ಮೂಲಕ ರಚಿಸಲಾಗುತ್ತದೆ (ಅನುಕ್ರಮ).
ಸ್ಪೇಸ್ ಡಿಡಿಎಲ್ ಈ ರೀತಿ ಕಾಣುತ್ತದೆ:
space = box.schema.space.create(config.space_name, {id = config.space_id, temporary = true})
space:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, sequence = true})
space:format({{name = 'id', type = 'unsigned'}, {name = 'name', type = 'string', is_nullable = false}})
ಅಗತ್ಯವಿದ್ದರೆ, ಮಾನದಂಡವನ್ನು ಚಲಾಯಿಸುವ ಮೊದಲು, ಜಾಗವನ್ನು 10,000 ಟ್ಯೂಪಲ್ಸ್ ಫಾರ್ಮ್ಗಳಿಂದ ತುಂಬಿಸಲಾಗುತ್ತದೆ
{id, "tuplе_<id>"}
ಯಾದೃಚ್ಛಿಕ ಕೀ ಮೌಲ್ಯವನ್ನು ಬಳಸಿಕೊಂಡು Tuples ಅನ್ನು ಪ್ರವೇಶಿಸಲಾಗುತ್ತದೆ.
ಮಾನದಂಡವು ಸರ್ವರ್ಗೆ ಒಂದೇ ವಿನಂತಿಯಾಗಿದೆ, ಇದನ್ನು 10,000 ಬಾರಿ (ಕ್ರಾಂತಿಗಳು) ಕಾರ್ಯಗತಗೊಳಿಸಲಾಗುತ್ತದೆ, ಇದನ್ನು ಪುನರಾವರ್ತನೆಗಳಲ್ಲಿ ಕಾರ್ಯಗತಗೊಳಿಸಲಾಗುತ್ತದೆ. 5 ಪುನರಾವರ್ತನೆಗಳ ನಡುವಿನ ಎಲ್ಲಾ ಸಮಯದ ವಿಚಲನಗಳು 3%* ನ ಸ್ವೀಕಾರಾರ್ಹ ದೋಷದೊಳಗೆ ಇರುವವರೆಗೆ ಪುನರಾವರ್ತನೆಗಳನ್ನು ಪುನರಾವರ್ತಿಸಲಾಗುತ್ತದೆ. ಇದರ ನಂತರ, ಸರಾಸರಿ ಫಲಿತಾಂಶವನ್ನು ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತದೆ. ಪ್ರೊಸೆಸರ್ ಥ್ರೊಟ್ಲಿಂಗ್ ಅನ್ನು ತಡೆಯಲು ಪುನರಾವರ್ತನೆಗಳ ನಡುವೆ 1 ಸೆಕೆಂಡ್ ವಿರಾಮವಿದೆ. ಪ್ರತಿ ಪುನರಾವರ್ತನೆಯ ಮೊದಲು ಲುವಾ ಅವರ ಕಸ ಸಂಗ್ರಾಹಕವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಅದು ಪೂರ್ಣಗೊಂಡ ನಂತರ ಪ್ರಾರಂಭಿಸಲು ಒತ್ತಾಯಿಸಲಾಗುತ್ತದೆ. PHP ಪ್ರಕ್ರಿಯೆಯನ್ನು ಬೆಂಚ್ಮಾರ್ಕ್ಗೆ ಅಗತ್ಯವಾದ ವಿಸ್ತರಣೆಗಳೊಂದಿಗೆ ಮಾತ್ರ ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತದೆ, ಔಟ್ಪುಟ್ ಬಫರಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಮತ್ತು ಕಸ ಸಂಗ್ರಾಹಕವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.
* ಬೆಂಚ್ಮಾರ್ಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಕ್ರಾಂತಿಗಳ ಸಂಖ್ಯೆ, ಪುನರಾವರ್ತನೆಗಳು ಮತ್ತು ದೋಷ ಮಿತಿಯನ್ನು ಬದಲಾಯಿಸಬಹುದು.
ಪರೀಕ್ಷಾ ಪರಿಸರ
ಕೆಳಗೆ ಪ್ರಕಟಿಸಲಾದ ಫಲಿತಾಂಶಗಳನ್ನು MacBookPro (2015), ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ - Fedora 30 (ಕರ್ನಲ್ ಆವೃತ್ತಿ 5.3.8-200.fc30.x86_64) ನಲ್ಲಿ ಮಾಡಲಾಗಿದೆ. ಟ್ಯಾರಂಟೂಲ್ ಅನ್ನು ಡಾಕರ್ನಲ್ಲಿ ಪ್ಯಾರಾಮೀಟರ್ನೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸಲಾಯಿತು "--network host".
* ದುರದೃಷ್ಟವಶಾತ್, ಅಧಿಕೃತ ಕನೆಕ್ಟರ್ PHP ಆವೃತ್ತಿ > 7.2 ನೊಂದಿಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ. PHP 7.3 ನಲ್ಲಿ ವಿಸ್ತರಣೆಯನ್ನು ಕಂಪೈಲ್ ಮಾಡಲು ಮತ್ತು ಚಲಾಯಿಸಲು, ನಾನು ಬಳಸಬೇಕಾಗಿತ್ತು ತೇಪೆ.
ರೆಸೆಲ್ಯೂಟ್ಸ್
ಸಿಂಕ್ರೊನಸ್ ಮೋಡ್
Tarantool ಪ್ರೋಟೋಕಾಲ್ ಬೈನರಿ ಫಾರ್ಮ್ಯಾಟ್ ಅನ್ನು ಬಳಸುತ್ತದೆ ಸಂದೇಶ ಪ್ಯಾಕ್ ಸಂದೇಶಗಳನ್ನು ಧಾರಾವಾಹಿ ಮಾಡಲು. ಪಿಇಸಿಎಲ್ ಕನೆಕ್ಟರ್ನಲ್ಲಿ, ಧಾರಾವಾಹಿಯನ್ನು ಗ್ರಂಥಾಲಯದ ಆಳದಲ್ಲಿ ಮರೆಮಾಡಲಾಗಿದೆ ಮತ್ತು ಯೂಸರ್ಲ್ಯಾಂಡ್ ಕೋಡ್ನಿಂದ ಎನ್ಕೋಡಿಂಗ್ ಪ್ರಕ್ರಿಯೆಯ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತದೆ ಸಾಧ್ಯವೆಂದು ತೋರುತ್ತಿಲ್ಲ. ಶುದ್ಧ PHP ಕನೆಕ್ಟರ್, ಇದಕ್ಕೆ ವಿರುದ್ಧವಾಗಿ, ಪ್ರಮಾಣಿತ ಎನ್ಕೋಡರ್ ಅನ್ನು ವಿಸ್ತರಿಸುವ ಮೂಲಕ ಅಥವಾ ನಿಮ್ಮ ಸ್ವಂತ ಅನುಷ್ಠಾನವನ್ನು ಬಳಸಿಕೊಂಡು ಎನ್ಕೋಡಿಂಗ್ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಒದಗಿಸುತ್ತದೆ. ಬಾಕ್ಸ್ನ ಹೊರಗೆ ಎರಡು ಎನ್ಕೋಡರ್ಗಳು ಲಭ್ಯವಿವೆ, ಒಂದನ್ನು ಆಧರಿಸಿದೆ msgpack/msgpack-php (ಅಧಿಕೃತ MessagePack PECL ವಿಸ್ತರಣೆ), ಇನ್ನೊಂದು ಆನ್ ಆಗಿದೆ rybakit/msgpack (ಶುದ್ಧ PHP ಯಲ್ಲಿ).
ಕನೆಕ್ಟರ್ಗಳನ್ನು ಹೋಲಿಸುವ ಮೊದಲು, ನಾವು PHP ಕನೆಕ್ಟರ್ಗಾಗಿ MessagePack ಎನ್ಕೋಡರ್ಗಳ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಅಳೆಯುತ್ತೇವೆ ಮತ್ತು ಮುಂದಿನ ಪರೀಕ್ಷೆಗಳಲ್ಲಿ ನಾವು ಉತ್ತಮ ಫಲಿತಾಂಶವನ್ನು ತೋರಿಸುವ ಒಂದನ್ನು ಬಳಸುತ್ತೇವೆ:
ಪಿಎಚ್ಪಿ ಆವೃತ್ತಿಯು (ಶುದ್ಧ) ವೇಗದಲ್ಲಿ ಪಿಇಸಿಎಲ್ ವಿಸ್ತರಣೆಗಿಂತ ಕೆಳಮಟ್ಟದ್ದಾಗಿದ್ದರೂ, ನೈಜ ಯೋಜನೆಗಳಲ್ಲಿ ನಾನು ಅದನ್ನು ಬಳಸಲು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ rybakit/msgpack, ಏಕೆಂದರೆ ಅಧಿಕೃತ MessagePack ವಿಸ್ತರಣೆಯಲ್ಲಿ ಫಾರ್ಮ್ಯಾಟ್ ವಿವರಣೆಯನ್ನು ಭಾಗಶಃ ಮಾತ್ರ ಅಳವಡಿಸಲಾಗಿದೆ (ಉದಾಹರಣೆಗೆ, ಕಸ್ಟಮ್ ಡೇಟಾ ಪ್ರಕಾರಗಳಿಗೆ ಯಾವುದೇ ಬೆಂಬಲವಿಲ್ಲ, ಅದು ಇಲ್ಲದೆ ನೀವು ಡೆಸಿಮಲ್ ಅನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ - Tarantool 2.3 ರಲ್ಲಿ ಪರಿಚಯಿಸಲಾದ ಹೊಸ ಡೇಟಾ ಪ್ರಕಾರ) ಮತ್ತು ಇತರರ ಸಂಖ್ಯೆ ಸಮಸ್ಯೆಗಳು (PHP 7.4 ನೊಂದಿಗೆ ಹೊಂದಾಣಿಕೆಯ ಸಮಸ್ಯೆಗಳನ್ನು ಒಳಗೊಂಡಂತೆ). ಒಳ್ಳೆಯದು, ಸಾಮಾನ್ಯವಾಗಿ, ಯೋಜನೆಯು ಕೈಬಿಟ್ಟಂತೆ ಕಾಣುತ್ತದೆ.
ಆದ್ದರಿಂದ, ಸಿಂಕ್ರೊನಸ್ ಮೋಡ್ನಲ್ಲಿ ಕನೆಕ್ಟರ್ಗಳ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಅಳೆಯೋಣ:
ಗ್ರಾಫ್ನಿಂದ ನೋಡಬಹುದಾದಂತೆ, PHP ಕನೆಕ್ಟರ್ (ಕ್ಲೈಂಟ್) ಗೆ ಹೋಲಿಸಿದರೆ PECL ಕನೆಕ್ಟರ್ (Tarantool) ಉತ್ತಮ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ತೋರಿಸುತ್ತದೆ. ಆದರೆ ಇದು ಆಶ್ಚರ್ಯವೇನಿಲ್ಲ, ಎರಡನೆಯದು, ನಿಧಾನ ಭಾಷೆಯಲ್ಲಿ ಕಾರ್ಯಗತಗೊಳಿಸುವುದರ ಜೊತೆಗೆ, ವಾಸ್ತವವಾಗಿ ಹೆಚ್ಚು ಕೆಲಸ ಮಾಡುತ್ತದೆ: ಪ್ರತಿ ಕರೆಯೊಂದಿಗೆ ಹೊಸ ವಸ್ತುವನ್ನು ರಚಿಸಲಾಗುತ್ತದೆ. ವಿನಂತಿ и ಪ್ರತಿಕ್ರಿಯೆ (ಆಯ್ಕೆ ಸಂದರ್ಭದಲ್ಲಿ - ಸಹ ಮಾನದಂಡ, ಮತ್ತು ಅಪ್ಡೇಟ್/ಅಪ್ಸರ್ಟ್ನ ಸಂದರ್ಭದಲ್ಲಿ - ಕಾರ್ಯಾಚರಣೆ), ಪ್ರತ್ಯೇಕ ಘಟಕಗಳು ಸಂಪರ್ಕ, ಪ್ಯಾಕರ್ и ಹ್ಯಾಂಡ್ಲರ್ ಅವರು ಓವರ್ಹೆಡ್ ಅನ್ನು ಕೂಡ ಸೇರಿಸುತ್ತಾರೆ. ನಿಸ್ಸಂಶಯವಾಗಿ, ನಮ್ಯತೆಯು ಬೆಲೆಗೆ ಬರುತ್ತದೆ. ಆದಾಗ್ಯೂ, ಸಾಮಾನ್ಯವಾಗಿ, PHP ಇಂಟರ್ಪ್ರಿಟರ್ ಉತ್ತಮ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ತೋರಿಸುತ್ತದೆ, ಆದರೂ ವ್ಯತ್ಯಾಸವಿದೆ, ಇದು ಅತ್ಯಲ್ಪವಾಗಿದೆ ಮತ್ತು PHP 7.4 ನಲ್ಲಿ ಪೂರ್ವ ಲೋಡ್ ಅನ್ನು ಬಳಸುವಾಗ ಬಹುಶಃ ಇನ್ನೂ ಕಡಿಮೆಯಿರುತ್ತದೆ, PHP 8 ರಲ್ಲಿ JIT ಅನ್ನು ಉಲ್ಲೇಖಿಸಬಾರದು.
ಮುಂದೆ ಸಾಗೋಣ. Tarantool 2.0 SQL ಗೆ ಬೆಂಬಲವನ್ನು ಸೇರಿಸಿತು. SQL ಪ್ರೋಟೋಕಾಲ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ, ಸೇರಿಸಿ, ನವೀಕರಿಸಿ ಮತ್ತು ಅಳಿಸಲು ಪ್ರಯತ್ನಿಸೋಣ ಮತ್ತು ಫಲಿತಾಂಶಗಳನ್ನು noSQL (ಬೈನರಿ) ಸಮಾನತೆಗಳೊಂದಿಗೆ ಹೋಲಿಸಿ:
SQL ಫಲಿತಾಂಶಗಳು ಹೆಚ್ಚು ಪ್ರಭಾವಶಾಲಿಯಾಗಿಲ್ಲ (ನಾವು ಇನ್ನೂ ಸಿಂಕ್ರೊನಸ್ ಮೋಡ್ ಅನ್ನು ಪರೀಕ್ಷಿಸುತ್ತಿದ್ದೇವೆ ಎಂದು ನಾನು ನಿಮಗೆ ನೆನಪಿಸುತ್ತೇನೆ). ಆದಾಗ್ಯೂ, ನಾನು ಈ ಬಗ್ಗೆ ಮುಂಚಿತವಾಗಿ ಅಸಮಾಧಾನಗೊಳ್ಳುವುದಿಲ್ಲ; SQL ಬೆಂಬಲವು ಇನ್ನೂ ಸಕ್ರಿಯ ಅಭಿವೃದ್ಧಿಯಲ್ಲಿದೆ (ತುಲನಾತ್ಮಕವಾಗಿ ಇತ್ತೀಚೆಗೆ, ಉದಾಹರಣೆಗೆ, ಬೆಂಬಲವನ್ನು ಸೇರಿಸಲಾಗಿದೆ ಸಿದ್ಧಪಡಿಸಿದ ಹೇಳಿಕೆಗಳು) ಮತ್ತು, ಪಟ್ಟಿಯಿಂದ ನಿರ್ಣಯಿಸುವುದು ಸಮಸ್ಯೆಗಳು, SQL ಎಂಜಿನ್ ಭವಿಷ್ಯದಲ್ಲಿ ಹಲವಾರು ಆಪ್ಟಿಮೈಸೇಶನ್ಗಳಿಗೆ ಒಳಗಾಗುತ್ತದೆ.
ಅಸಿಂಕ್
ಸರಿ, ಈಗ Async ವಿಸ್ತರಣೆಯು ಮೇಲಿನ ಫಲಿತಾಂಶಗಳನ್ನು ಸುಧಾರಿಸಲು ನಮಗೆ ಹೇಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ ಎಂದು ನೋಡೋಣ. ಅಸಮಕಾಲಿಕ ಕಾರ್ಯಕ್ರಮಗಳನ್ನು ಬರೆಯಲು, ವಿಸ್ತರಣೆಯು ಕೊರೊಟೈನ್ಗಳ ಆಧಾರದ ಮೇಲೆ API ಅನ್ನು ಒದಗಿಸುತ್ತದೆ, ಅದನ್ನು ನಾವು ಬಳಸುತ್ತೇವೆ. ನಮ್ಮ ಪರಿಸರಕ್ಕೆ ಸೂಕ್ತವಾದ ಕೊರೂಟಿನ್ಗಳ ಸಂಖ್ಯೆ 25 ಎಂದು ನಾವು ಪ್ರಾಯೋಗಿಕವಾಗಿ ಕಂಡುಕೊಳ್ಳುತ್ತೇವೆ:
10,000 ಕೊರೂಟಿನ್ಗಳಲ್ಲಿ 25 ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು "ಹರಡಿಸು" ಮತ್ತು ಏನಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ನೋಡಿ:
ಪ್ರತಿ ಸೆಕೆಂಡಿಗೆ ಕಾರ್ಯಾಚರಣೆಗಳ ಸಂಖ್ಯೆಯು 3 ಪಟ್ಟು ಹೆಚ್ಚು ಹೆಚ್ಚಾಗಿದೆ tarantool-php/ಕ್ಲೈಂಟ್!
ದುಃಖಕರವೆಂದರೆ, PECL ಕನೆಕ್ಟರ್ ext-async ನೊಂದಿಗೆ ಪ್ರಾರಂಭವಾಗಲಿಲ್ಲ.
SQL ಬಗ್ಗೆ ಏನು?
ನೀವು ನೋಡುವಂತೆ, ಅಸಮಕಾಲಿಕ ಮೋಡ್ನಲ್ಲಿ ಬೈನರಿ ಪ್ರೋಟೋಕಾಲ್ ಮತ್ತು SQL ನಡುವಿನ ವ್ಯತ್ಯಾಸವು ದೋಷದ ಅಂಚಿನಲ್ಲಿದೆ.
ಸ್ವೂಲ್
ಸ್ವೂಲ್ಗಾಗಿ ಈ ಬಾರಿ ಕೊರೂಟಿನ್ಗಳ ಅತ್ಯುತ್ತಮ ಸಂಖ್ಯೆಯನ್ನು ನಾವು ಮತ್ತೆ ಕಂಡುಕೊಳ್ಳುತ್ತೇವೆ:
25 ಕ್ಕೆ ನಿಲ್ಲಿಸೋಣ. ಅಸಿಂಕ್ ವಿಸ್ತರಣೆಯೊಂದಿಗೆ ಅದೇ ಟ್ರಿಕ್ ಅನ್ನು ಪುನರಾವರ್ತಿಸೋಣ - 10,000 ಕೊರೂಟಿನ್ಗಳ ನಡುವೆ 25 ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ವಿತರಿಸಿ. ಹೆಚ್ಚುವರಿಯಾಗಿ, ನಾವು ಮತ್ತೊಂದು ಪರೀಕ್ಷೆಯನ್ನು ಸೇರಿಸುತ್ತೇವೆ, ಇದರಲ್ಲಿ ನಾವು ಎಲ್ಲಾ ಕೆಲಸವನ್ನು 2 ಎರಡು ಪ್ರಕ್ರಿಯೆಗಳಾಗಿ ವಿಂಗಡಿಸುತ್ತೇವೆ (ಅಂದರೆ, ಪ್ರತಿ ಪ್ರಕ್ರಿಯೆಯು 5,000 ಕೊರೂಟಿನ್ಗಳಲ್ಲಿ 25 ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ). ಬಳಸಿ ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ರಚಿಸಲಾಗುತ್ತದೆ ಸ್ವೂಲ್ ಪ್ರಕ್ರಿಯೆ.
ಫಲಿತಾಂಶಗಳು:
ಒಂದು ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ರನ್ ಮಾಡಿದಾಗ ಅಸಿಂಕ್ಗೆ ಹೋಲಿಸಿದರೆ ಸ್ವೋಲ್ ಸ್ವಲ್ಪ ಕಡಿಮೆ ಫಲಿತಾಂಶವನ್ನು ತೋರಿಸುತ್ತದೆ, ಆದರೆ 2 ಪ್ರಕ್ರಿಯೆಗಳೊಂದಿಗೆ ಚಿತ್ರವು ನಾಟಕೀಯವಾಗಿ ಬದಲಾಗುತ್ತದೆ (ಸಂಖ್ಯೆ 2 ಅನ್ನು ಆಕಸ್ಮಿಕವಾಗಿ ಆಯ್ಕೆ ಮಾಡಲಾಗಿಲ್ಲ; ನನ್ನ ಗಣಕದಲ್ಲಿ, ಇದು 2 ಪ್ರಕ್ರಿಯೆಗಳು ಉತ್ತಮ ಫಲಿತಾಂಶವನ್ನು ತೋರಿಸಿದವು).
ಮೂಲಕ, Async ವಿಸ್ತರಣೆಯು ಪ್ರಕ್ರಿಯೆಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು API ಅನ್ನು ಸಹ ಹೊಂದಿದೆ, ಆದರೆ ಅಲ್ಲಿ ನಾನು ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಪ್ರಕ್ರಿಯೆಗಳಲ್ಲಿ ಬೆಂಚ್ಮಾರ್ಕ್ಗಳನ್ನು ಚಲಾಯಿಸುವುದರಿಂದ ಯಾವುದೇ ವ್ಯತ್ಯಾಸವನ್ನು ಗಮನಿಸಲಿಲ್ಲ (ನಾನು ಎಲ್ಲೋ ಗೊಂದಲಕ್ಕೊಳಗಾಗಿರಬಹುದು).
SQL vs ಬೈನರಿ ಪ್ರೋಟೋಕಾಲ್:
Async ನಂತೆ, ಬೈನರಿ ಮತ್ತು SQL ಕಾರ್ಯಾಚರಣೆಗಳ ನಡುವಿನ ವ್ಯತ್ಯಾಸವನ್ನು ಅಸಮಕಾಲಿಕ ಕ್ರಮದಲ್ಲಿ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ.
ಸಮಾನಾಂತರ
ಸಮಾನಾಂತರ ವಿಸ್ತರಣೆಯು ಕೊರೂಟಿನ್ಗಳ ಬಗ್ಗೆ ಅಲ್ಲ, ಆದರೆ ಥ್ರೆಡ್ಗಳ ಬಗ್ಗೆ, ಸಮಾನಾಂತರ ಥ್ರೆಡ್ಗಳ ಅತ್ಯುತ್ತಮ ಸಂಖ್ಯೆಯನ್ನು ಅಳೆಯೋಣ:
ಇದು ನನ್ನ ಯಂತ್ರದಲ್ಲಿ 16 ಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ. 16 ಸಮಾನಾಂತರ ಥ್ರೆಡ್ಗಳಲ್ಲಿ ಕನೆಕ್ಟರ್ ಬೆಂಚ್ಮಾರ್ಕ್ಗಳನ್ನು ರನ್ ಮಾಡೋಣ:
ನೀವು ನೋಡುವಂತೆ, ಫಲಿತಾಂಶವು ಅಸಮಕಾಲಿಕ ವಿಸ್ತರಣೆಗಳಿಗಿಂತ ಉತ್ತಮವಾಗಿದೆ (2 ಪ್ರಕ್ರಿಯೆಗಳಲ್ಲಿ ಚಾಲನೆಯಲ್ಲಿರುವ ಸ್ವೂಲ್ ಅನ್ನು ಲೆಕ್ಕಿಸುವುದಿಲ್ಲ). PECL ಕನೆಕ್ಟರ್ಗಾಗಿ, ಅಪ್ಡೇಟ್ ಮತ್ತು ಅಪ್ಸರ್ಟ್ ಕಾರ್ಯಾಚರಣೆಗಳು ಖಾಲಿಯಾಗಿವೆ ಎಂಬುದನ್ನು ಗಮನಿಸಿ. ಈ ಕಾರ್ಯಾಚರಣೆಗಳು ದೋಷದಿಂದ ವಿಫಲವಾಗಿವೆ ಎಂಬ ಅಂಶದಿಂದಾಗಿ ಇದು ಸಂಭವಿಸುತ್ತದೆ - ಇದು ಎಕ್ಸ್ಟ್-ಪ್ಯಾರಲಲ್, ಎಕ್ಸ್ಟ್-ಟ್ಯಾರಂಟೂಲ್ ಅಥವಾ ಎರಡರ ದೋಷವೇ ಎಂದು ನನಗೆ ತಿಳಿದಿಲ್ಲ.
ಈಗ SQL ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಹೋಲಿಸೋಣ:
ಸಿಂಕ್ರೊನಸ್ ಆಗಿ ಚಾಲನೆಯಲ್ಲಿರುವ ಕನೆಕ್ಟರ್ಗಳಿಗಾಗಿ ಗ್ರಾಫ್ನೊಂದಿಗೆ ಹೋಲಿಕೆಯನ್ನು ಗಮನಿಸಿ?
ಒಟ್ಟಿಗೆ
ಮತ್ತು ಅಂತಿಮವಾಗಿ, ಪರೀಕ್ಷಿತ ವಿಸ್ತರಣೆಗಳಿಗಾಗಿ ಒಟ್ಟಾರೆ ಚಿತ್ರವನ್ನು ನೋಡಲು ಒಂದು ಗ್ರಾಫ್ನಲ್ಲಿ ಎಲ್ಲಾ ಫಲಿತಾಂಶಗಳನ್ನು ಸಾರಾಂಶ ಮಾಡೋಣ. ಚಾರ್ಟ್ಗೆ ಕೇವಲ ಒಂದು ಹೊಸ ಪರೀಕ್ಷೆಯನ್ನು ಸೇರಿಸೋಣ, ಅದನ್ನು ನಾವು ಇನ್ನೂ ಮಾಡಿಲ್ಲ - ಸಮಾನಾಂತರವನ್ನು ಬಳಸಿಕೊಂಡು Async ಕೊರೂಟಿನ್ಗಳನ್ನು ಸಮಾನಾಂತರವಾಗಿ ರನ್ ಮಾಡೋಣ. ಮೇಲಿನ ವಿಸ್ತರಣೆಗಳನ್ನು ಸಂಯೋಜಿಸುವ ಕಲ್ಪನೆಯು ಈಗಾಗಲೇ ಇದೆ ಚರ್ಚಿಸಲಾಯಿತು ಲೇಖಕರು, ಆದರೆ ಯಾವುದೇ ಒಮ್ಮತವನ್ನು ತಲುಪಲಾಗಿಲ್ಲ, ನೀವೇ ಅದನ್ನು ಮಾಡಬೇಕಾಗುತ್ತದೆ.
* ಸಮಾನಾಂತರದೊಂದಿಗೆ ಸ್ವೂಲ್ ಕೊರೂಟಿನ್ಗಳನ್ನು ಪ್ರಾರಂಭಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಈ ವಿಸ್ತರಣೆಗಳು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ ಎಂದು ತೋರುತ್ತದೆ.
ಆದ್ದರಿಂದ, ಅಂತಿಮ ಫಲಿತಾಂಶಗಳು:
ಬದಲಿಗೆ ತೀರ್ಮಾನದ
ನನ್ನ ಅಭಿಪ್ರಾಯದಲ್ಲಿ, ಫಲಿತಾಂಶಗಳು ಸಾಕಷ್ಟು ಯೋಗ್ಯವಾಗಿವೆ, ಮತ್ತು ಕೆಲವು ಕಾರಣಗಳಿಂದ ಇದು ಮಿತಿಯಲ್ಲ ಎಂದು ನನಗೆ ಖಾತ್ರಿಯಿದೆ! ನಿಮಗಾಗಿ ಮಾತ್ರ ನಿಜವಾದ ಯೋಜನೆಯಲ್ಲಿ ನೀವು ಇದನ್ನು ನಿರ್ಧರಿಸಬೇಕೇ ಎಂದು ನಾನು ಹೇಳುತ್ತೇನೆ, ಇದು ನನಗೆ ಆಸಕ್ತಿದಾಯಕ ಪ್ರಯೋಗವಾಗಿದೆ ಎಂದು ನಾನು ಹೇಳುತ್ತೇನೆ, ಇದು ಸಿಂಕ್ರೊನಸ್ TCP ಕನೆಕ್ಟರ್ನಿಂದ ಕನಿಷ್ಠ ಪ್ರಯತ್ನದೊಂದಿಗೆ ನೀವು ಎಷ್ಟು "ಸ್ಕ್ವೀಜ್" ಮಾಡಬಹುದು ಎಂಬುದನ್ನು ಮೌಲ್ಯಮಾಪನ ಮಾಡಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ಬೆಂಚ್ಮಾರ್ಕ್ಗಳನ್ನು ಸುಧಾರಿಸಲು ನೀವು ಆಲೋಚನೆಗಳನ್ನು ಹೊಂದಿದ್ದರೆ, ನಿಮ್ಮ ಪುಲ್ ವಿನಂತಿಯನ್ನು ಪರಿಗಣಿಸಲು ನಾನು ಸಂತೋಷಪಡುತ್ತೇನೆ. ಉಡಾವಣಾ ಸೂಚನೆಗಳು ಮತ್ತು ಫಲಿತಾಂಶಗಳೊಂದಿಗೆ ಎಲ್ಲಾ ಕೋಡ್ ಅನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿ ಪ್ರಕಟಿಸಲಾಗಿದೆ ಭಂಡಾರಗಳು.