Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا

پی ایچ پی ایکو سسٹم میں اس وقت ٹرانٹول سرور کے ساتھ کام کرنے کے لیے دو کنیکٹر ہیں - یہ پی ای سی ایل کی آفیشل ایکسٹینشن ہے۔ tarantool/tarantool-php، C میں لکھا گیا ہے، اور tarantool-php/client، پی ایچ پی میں لکھا گیا۔ میں مؤخر الذکر کا مصنف ہوں۔

اس مضمون میں، میں دونوں لائبریریوں کی کارکردگی کی جانچ کے نتائج کا اشتراک کرنا چاہوں گا اور یہ بتانا چاہوں گا کہ کوڈ میں کم سے کم تبدیلیوں کے ساتھ، آپ کس طرح کارکردگی میں 3-5 کا اضافہ حاصل کر سکتے ہیں (مصنوعی ٹیسٹوں پر!).

ہم کیا ٹیسٹ کریں گے؟

ہم اوپر بیان کردہ ٹیسٹ کریں گے۔ ہم وقت ساز متوازی طور پر، متوازی طور پر، اور متوازی طور پر متوازی طور پر چلنے والے کنیکٹر۔ 🙂 ہم خود بھی کنیکٹرز کے کوڈ کو ہاتھ نہیں لگانا چاہتے۔ آپ جو چاہتے ہیں اسے حاصل کرنے کے لیے فی الحال کئی ایکسٹینشنز دستیاب ہیں:

  • سوول - PHP کے لیے ایک اعلی کارکردگی کا غیر مطابقت پذیر فریم ورک۔ علی بابا اور بیدو جیسی انٹرنیٹ کمپنیاں استعمال کرتی ہیں۔ ورژن 4.1.0 کے بعد سے ایک جادوئی طریقہ ظاہر ہوا ہے۔ SwooleRuntime::enableCoroutine()، جو آپ کو "ہم وقت ساز پی ایچ پی نیٹ ورک لائبریریوں کو کوڈ کی ایک لائن کے ساتھ غیر مطابقت پذیر لائبریریوں میں تبدیل کرنے کی اجازت دیتا ہے۔"
  • Async حال ہی میں پی ایچ پی میں غیر مطابقت پذیر کام کے لئے ایک بہت ہی امید افزا توسیع تھی۔ حال ہی میں کیوں؟ بدقسمتی سے، میرے لیے نامعلوم وجہ سے، مصنف نے ذخیرہ کو حذف کر دیا اور اس منصوبے کی مستقبل کی قسمت واضح نہیں ہے۔ مجھے اسے استعمال کرنا پڑے گا۔ ایک کانٹے سے Swoole کی طرح، یہ ایکسٹینشن آپ کو آسانی سے اپنی پتلون کو کلائی کے ایک جھٹکے سے آن کرنے کی اجازت دیتا ہے تاکہ TCP اور TLS اسٹریمز کے معیاری نفاذ کو ان کے غیر مطابقت پذیر ورژنز سے تبدیل کر کے غیر مطابقت پذیری کو فعال کیا جا سکے۔ یہ آپشن کے ذریعے کیا جاتا ہے "async.tcp = 1".
  • متوازی - phpdbg، apcu، pthreads، pcov، uopz جیسی لائبریریوں کے مصنف معروف Joe Watkins کی طرف سے کافی نئی توسیع۔ ایکسٹینشن PHP میں ملٹی تھریڈنگ کے لیے ایک API فراہم کرتی ہے اور اسے pthreads کے متبادل کے طور پر رکھا گیا ہے۔ لائبریری کی ایک اہم حد یہ ہے کہ یہ صرف PHP کے ZTS (Zend Thread Safe) ورژن کے ساتھ کام کرتی ہے۔

ہم کیسے ٹیسٹ کریں گے؟

آئیے ایک ٹرانٹول مثال شروع کریں جس میں لکھنے کے آگے لاگنگ غیر فعال ہے (wal_mode = کوئی نہیں۔) اور نیٹ ورک بفر میں اضافہ (ریڈہیڈ = 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 سیکنڈ کا وقفہ ہے۔ Lua کا کوڑا اٹھانے والا ہر تکرار سے پہلے غیر فعال ہو جاتا ہے اور اسے مکمل ہونے کے بعد شروع کرنے پر مجبور کیا جاتا ہے۔ پی ایچ پی کا عمل صرف بینچ مارک کے لیے ضروری ایکسٹینشنز کے ساتھ شروع کیا جاتا ہے، آؤٹ پٹ بفرنگ فعال اور کوڑا اٹھانے والے کو غیر فعال کر دیا جاتا ہے۔

* انقلابات کی تعداد، تکرار اور غلطی کی حد کو بینچ مارک سیٹنگز میں تبدیل کیا جا سکتا ہے۔

ٹیسٹ ماحول

ذیل میں شائع شدہ نتائج MacBookPro (2015)، آپریٹنگ سسٹم - Fedora 30 (kernel version 5.3.8-200.fc30.x86_64) پر بنائے گئے تھے۔ ترن ٹول کو پیرامیٹر کے ساتھ ڈوکر میں لانچ کیا گیا تھا۔--network host".

پیکیج ورژن:

Tarantool: 2.3.0-115-g5ba5ed37e
ڈوکر: 19.03.3، a872fc2f86 بنائیں
PHP: 7.3.11 (cli) (تعمیر شدہ: 22 اکتوبر 2019 08:11:04)
ٹیرانٹول/کلائنٹ: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ patch for 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-paralel: 1.1.3

* بدقسمتی سے، آفیشل کنیکٹر پی ایچ پی ورژن > 7.2 کے ساتھ کام نہیں کرتا ہے۔ پی ایچ پی 7.3 پر ایکسٹینشن کو مرتب کرنے اور چلانے کے لیے، مجھے استعمال کرنا پڑا پیچ.

نتائج

ہم وقت ساز موڈ

ٹرانٹول پروٹوکول بائنری فارمیٹ استعمال کرتا ہے۔ میسج پیک پیغامات کو سیریلائز کرنے کے لیے۔ پی ای سی ایل کنیکٹر میں، سیریلائزیشن لائبریری کی گہرائی میں چھپی ہوئی ہے اور یوزر لینڈ کوڈ سے انکوڈنگ کے عمل کو متاثر کرتی ہے۔ ممکن نہیں لگتا. ایک خالص پی ایچ پی کنیکٹر، اس کے برعکس، معیاری انکوڈر کو بڑھا کر یا آپ کے اپنے عمل کو استعمال کرکے انکوڈنگ کے عمل کو اپنی مرضی کے مطابق کرنے کی صلاحیت فراہم کرتا ہے۔ باکس کے باہر دو انکوڈر دستیاب ہیں، ایک پر مبنی ہے۔ msgpack/msgpack-php (آفیشل میسج پیک پی ای سی ایل ایکسٹینشن)، دوسرا آن ہے۔ rybakit/msgpack (خالص پی ایچ پی میں)۔

کنیکٹرز کا موازنہ کرنے سے پہلے، ہم پی ایچ پی کنیکٹر کے لیے میسج پیک انکوڈرز کی کارکردگی کی پیمائش کریں گے اور مزید ٹیسٹوں میں ہم اسے استعمال کریں گے جو بہترین نتیجہ دکھاتا ہے:

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا
اگرچہ پی ایچ پی ورژن (خالص) رفتار میں پی ای سی ایل کی توسیع سے کمتر ہے، لیکن حقیقی پروجیکٹس میں میں پھر بھی اسے استعمال کرنے کی سفارش کروں گا۔ rybakit/msgpack، کیونکہ آفیشل میسج پیک ایکسٹینشن میں فارمیٹ کی تفصیلات صرف جزوی طور پر لاگو ہوتی ہیں (مثال کے طور پر، حسب ضرورت ڈیٹا کی قسموں کے لیے کوئی سپورٹ نہیں ہے، جس کے بغیر آپ ڈیسیمل استعمال نہیں کر سکیں گے - ایک نئی ڈیٹا ٹائپ جو Tarantool 2.3 میں متعارف کرائی گئی ہے) اور دوسروں کی تعداد مسائل (پی ایچ پی 7.4 کے ساتھ مطابقت کے مسائل سمیت)۔ ٹھیک ہے، عام طور پر، منصوبہ ترک کر دیا جاتا ہے.

تو آئیے ہم وقت ساز موڈ میں کنیکٹرز کی کارکردگی کی پیمائش کریں:

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا
جیسا کہ گراف سے دیکھا جا سکتا ہے، PECL کنیکٹر (Tarantool) PHP کنیکٹر (کلائنٹ) کے مقابلے بہتر کارکردگی دکھاتا ہے۔ لیکن یہ حیرت کی بات نہیں ہے، یہ دیکھتے ہوئے کہ مؤخر الذکر، ایک دھیمی زبان میں لاگو ہونے کے علاوہ، درحقیقت زیادہ کام کرتا ہے: ہر کال کے ساتھ ایک نئی چیز بنائی جاتی ہے۔ کی درخواست и ریسپانس (سلیکٹ کے معاملے میں بھی ٹینڈر، اور اپ ڈیٹ/اپسرٹ کی صورت میں - آپریشنز)، الگ الگ ادارے کنکشن, پیکر и ہینڈلر وہ اوپر کا اضافہ بھی کرتے ہیں۔ ظاہر ہے، لچک قیمت پر آتی ہے۔ تاہم، عام طور پر، پی ایچ پی ترجمان اچھی کارکردگی دکھاتا ہے، اگرچہ ایک فرق ہے، یہ معمولی ہے اور، شاید، پی ایچ پی 7.4 میں پری لوڈنگ کا استعمال کرتے وقت اس سے بھی کم ہوگا، پی ایچ پی 8 میں جے آئی ٹی کا ذکر نہ کرنا۔

آئیے آگے بڑھیں۔ Tarantool 2.0 نے SQL کے لیے تعاون شامل کیا۔ آئیے ایس کیو ایل پروٹوکول کا استعمال کرتے ہوئے سلیکٹ، انسرٹ، اپ ڈیٹ اور ڈیلیٹ آپریشنز انجام دینے کی کوشش کریں اور نتائج کا noSQL (بائنری) مساوی کے ساتھ موازنہ کریں:

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا
ایس کیو ایل کے نتائج بہت متاثر کن نہیں ہیں (میں آپ کو یاد دلاتا ہوں کہ ہم اب بھی سنکرونس موڈ کی جانچ کر رہے ہیں)۔ تاہم، میں وقت سے پہلے اس کے بارے میں پریشان نہیں ہوں گا؛ ایس کیو ایل سپورٹ ابھی بھی فعال ترقی کے تحت ہے (حال ہی میں، مثال کے طور پر، سپورٹ شامل کی گئی تھی۔ تیار بیانات) اور، فہرست کی طرف سے فیصلہ مسائل, SQL انجن مستقبل میں بہت سے اصلاح سے گزرے گا۔

async

ٹھیک ہے، اب دیکھتے ہیں کہ Async ایکسٹینشن اوپر کے نتائج کو بہتر بنانے میں ہماری مدد کیسے کر سکتی ہے۔ غیر مطابقت پذیر پروگرام لکھنے کے لیے، ایکسٹینشن کورٹینز پر مبنی ایک API فراہم کرتی ہے، جسے ہم استعمال کریں گے۔ ہمیں تجرباتی طور پر پتہ چلتا ہے کہ ہمارے ماحول کے لیے کوروٹینز کی زیادہ سے زیادہ تعداد 25 ہے:

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا
10,000 کوروٹینز میں 25 آپریشنز کو "پھیلاؤ" اور دیکھیں کہ کیا ہوتا ہے:

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا
فی سیکنڈ آپریشنز کی تعداد میں 3 گنا سے زیادہ اضافہ ہوا۔ tarantool-php/client!

افسوس کی بات ہے، PECL کنیکٹر ext-async کے ساتھ شروع نہیں ہوا۔

SQL کے بارے میں کیا خیال ہے؟

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا
جیسا کہ آپ دیکھ سکتے ہیں، غیر مطابقت پذیر موڈ میں بائنری پروٹوکول اور SQL کے درمیان فرق غلطی کے مارجن میں ہو گیا۔

سوول

ایک بار پھر ہم کوروٹینز کی زیادہ سے زیادہ تعداد تلاش کرتے ہیں، اس بار سوول کے لیے:
Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا
آئیے 25 پر رکتے ہیں۔ آئیے اسی چال کو دہراتے ہیں جیسا کہ Async ایکسٹینشن کے ساتھ ہے - 10,000 کوروٹینز کے درمیان 25 آپریشن تقسیم کریں۔ اس کے علاوہ، ہم ایک اور ٹیسٹ کا اضافہ کریں گے جس میں ہم تمام کام کو 2 دو عملوں میں تقسیم کریں گے (یعنی ہر عمل 5,000 کوروٹائنز میں 25 آپریشن کرے گا)۔ کا استعمال کرتے ہوئے عمل بنائے جائیں گے۔ SwooleProcess.

نتائج:

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا
Swole Async کے مقابلے میں تھوڑا کم نتیجہ دکھاتا ہے جب ایک عمل میں چلایا جاتا ہے، لیکن 2 عمل کے ساتھ تصویر ڈرامائی طور پر بدل جاتی ہے (نمبر 2 کا انتخاب اتفاق سے نہیں کیا گیا تھا؛ میری مشین پر، یہ 2 عمل تھے جنہوں نے بہترین نتیجہ دکھایا)۔

ویسے، Async ایکسٹینشن میں پروسیسز کے ساتھ کام کرنے کے لیے ایک API بھی ہے، لیکن وہاں مجھے ایک یا زیادہ پروسیسز میں بینچ مارک چلانے سے کوئی فرق محسوس نہیں ہوا (یہ ممکن ہے کہ میں نے کہیں گڑبڑ کر دی ہو)۔

ایس کیو ایل بمقابلہ بائنری پروٹوکول:

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا
Async کی طرح، بائنری اور SQL آپریشنز کے درمیان فرق کو غیر مطابقت پذیر موڈ میں ختم کر دیا جاتا ہے۔

متوازی

چونکہ متوازی توسیع کورٹینز کے بارے میں نہیں ہے، بلکہ دھاگوں کے بارے میں ہے، آئیے متوازی دھاگوں کی بہترین تعداد کی پیمائش کریں:

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا
یہ میری مشین پر 16 کے برابر ہے۔ آئیے 16 متوازی دھاگوں پر کنیکٹر بینچ مارکس چلائیں:

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا
جیسا کہ آپ دیکھ سکتے ہیں، نتیجہ غیر مطابقت پذیر ایکسٹینشنز کے مقابلے میں اور بھی بہتر ہے (2 عملوں پر چلنے والے Swoole کو شمار نہیں کرنا)۔ نوٹ کریں کہ PECL کنیکٹر کے لیے، اپ ڈیٹ اور اپسرٹ آپریشنز خالی ہیں۔ یہ اس حقیقت کی وجہ سے ہے کہ یہ کارروائیاں ایک غلطی کے ساتھ ناکام ہوئیں - مجھے نہیں معلوم کہ یہ ext-paralel، ext-tarantool، یا دونوں کی غلطی تھی۔

اب آئیے ایس کیو ایل کی کارکردگی کا موازنہ کریں:

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا
مطابقت پذیری سے چلنے والے کنیکٹرز کے گراف کے ساتھ مماثلت کو دیکھیں؟

ایک ساتھ

اور آخر میں، ٹیسٹ شدہ ایکسٹینشنز کی مجموعی تصویر دیکھنے کے لیے ایک گراف میں تمام نتائج کا خلاصہ کریں۔ آئیے چارٹ میں صرف ایک نیا ٹیسٹ شامل کریں، جو ہم نے ابھی تک نہیں کیا ہے - آئیے Parallel* کا استعمال کرتے ہوئے متوازی طور پر Async coroutines چلائیں۔ مذکورہ ایکسٹینشنز کو ضم کرنے کا خیال پہلے ہی موجود ہے۔ بحث کی گئی مصنفین، لیکن کوئی اتفاق رائے نہیں ہوا، آپ کو خود کرنا پڑے گا۔

* متوازی کے ساتھ سوول کوروٹینز لانچ کرنا ممکن نہیں تھا؛ ایسا لگتا ہے کہ یہ ایکسٹینشن مطابقت نہیں رکھتے۔

لہذا، حتمی نتائج:

Async، Swoole اور Parallel کا استعمال کرتے ہوئے Tarantool کے لیے PHP کنیکٹرز کو تیز کرنا

اس کے بجائے کسی نتیجے کے

میری رائے میں، نتائج کافی قابل تھے، اور کسی وجہ سے مجھے یقین ہے کہ یہ حد نہیں ہے! چاہے آپ کو یہ فیصلہ کسی حقیقی پروجیکٹ میں صرف اپنے لیے کرنے کی ضرورت ہے، میں صرف اتنا کہوں گا کہ میرے لیے یہ ایک دلچسپ تجربہ تھا جو آپ کو یہ اندازہ کرنے کی اجازت دیتا ہے کہ آپ کم سے کم کوشش کے ساتھ ہم وقت ساز TCP کنیکٹر سے کتنا "نچوڑ" سکتے ہیں۔ اگر آپ کے پاس بینچ مارکس کو بہتر بنانے کے خیالات ہیں، تو مجھے آپ کی پل کی درخواست پر غور کرنے میں خوشی ہوگی۔ لانچ ہدایات اور نتائج کے ساتھ تمام کوڈ الگ میں شائع کیا جاتا ہے۔ ذخیرے.

ماخذ: www.habr.com

نیا تبصرہ شامل کریں