دماغ + VPS 30 روبل کے لئے =؟

یہ بہت اچھا ہے جب تمام ضروری چھوٹی چیزیں ہاتھ میں ہوں: ایک اچھا قلم اور نوٹ پیڈ، ایک تیز پنسل، ایک آرام دہ ماؤس، کچھ اضافی تاریں وغیرہ۔ یہ غیر واضح چیزیں توجہ کو اپنی طرف متوجہ نہیں کرتی ہیں، لیکن زندگی میں آرام کا اضافہ کرتی ہیں. یہی کہانی مختلف موبائل اور ڈیسک ٹاپ ایپلی کیشنز کے ساتھ ہے: لمبے اسکرین شاٹس کے لیے، تصویر کا سائز کم کرنے کے لیے، ذاتی مالیات، لغات، مترجم، کنورٹرز وغیرہ کا حساب لگانے کے لیے۔ کیا ایک تمھارے پاس ہے؟ VPS - جو سستا ہے، ہمیشہ ہاتھ میں ہے اور بہت سے فوائد لاتا ہے؟ نہیں، وہ نہیں جو آپ کی کمپنی میں ہے، بلکہ آپ کی اپنی، "جیب" والا۔ ہم نے سوچا کہ 2019 میں ایک چھوٹے VPS کے بغیر یہ کسی طرح اداس تھا، بالکل اسی طرح جیسے کسی لیکچر میں عام فاؤنٹین پین کے بغیر۔ اداس کیوں ہو؟ یہ موسم گرما ہے. موسم گرما کیسا ہے؟ ایک آئی ٹی ماہر کے لیے موسم گرما: گھر بیٹھے، بغیر کسی افسوس کے اپنے پسندیدہ پروجیکٹس پر کام کرنا۔ عام طور پر، ہم نے سوچا اور کیا.

دماغ + VPS 30 روبل کے لئے =؟
کمیونزم آ گیا ہے ساتھیو۔

وہ ایسا ہی ہے - تیس کے لیے ہمارا VPS

ہم نے حریفوں اور صارفین کے بہت سے مضامین پڑھے ہیں جنہوں نے 3-4 سال پہلے لکھا تھا کہ کیوں سستے VPS کی ضرورت نہیں ہے۔ ٹھیک ہے، یہ ٹھیک ہے، پھر VPS "ایک پیسہ کے لیے" خالص مارکیٹنگ تھی اور کام کرنے کے معمول کے مواقع پیش نہیں کر سکتی تھی۔ لیکن وقت بدل رہا ہے، ورچوئل وسائل کی قیمت کم سے کم ہوتی جا رہی ہے، اور 30 ​​روبل ماہانہ کے لیے ہم یہ پیشکش کرنے کے لیے تیار ہیں:

  • پروسیسر: Intel Xeon 2 GHz (1 کور)
  • لینکس سسٹم (Debian، Ubuntu، CentOS میں سے انتخاب کرنا)
  • 1 وقف IPv4 پتہ
  • تیز انٹرپرائز کلاس SSD ڈرائیوز پر 10 GB ڈیٹا اسٹوریج
  • رام: 512 ایم بی
  • فی سیکنڈ بلنگ
  • لامحدود ٹریفک

ٹیرف اضافی تکنیکی پابندیوں سے مشروط ہے، تفصیلات پر صفحہ ہماری زبردست پیشکش - 30 روبل کے لیے VPS۔ 

یہ ورچوئل سرور کس کے لیے موزوں ہے؟ ہاں تقریباً ہر ایک کے لیے: ابتدائی، پرجوش، تجربہ کار ڈویلپرز، DIY کے پرستار اور یہاں تک کہ کچھ کمپنیاں۔

یہ VPS کس کے لیے موزوں ہے؟

ہمارا خیال ہے کہ حبر کے قارئین یقینی طور پر اس ترتیب کو استعمال کرنے کا اپنا طریقہ تلاش کریں گے، لیکن ہم نے اپنے خیالات کے اپنے انتخاب کو جمع کرنے کا فیصلہ کیا ہے - اگر کسی کو اس کی ضرورت ہو، لیکن مردوں کو معلوم نہ ہو تو کیا ہوگا؟

  • اپنی سادہ ویب سائٹ، پورٹ فولیو، کوڈ کے ساتھ دوبارہ شروع کریں، وغیرہ۔ بلاشبہ، آپ کی اپنی ڈیزائن کردہ ویب سائٹ آجر پر مثبت تاثر دیتی ہے۔ اسے اپنے VPS پر رکھیں اور سائٹ کی حفاظت اور استحکام کے لیے خود ذمہ دار بنیں، نہ کہ باقاعدہ ہوسٹنگ فراہم کرنے والوں کے عملے کے ذریعے۔
  • تعلیمی مقاصد کے لیے VPS کا استعمال کریں: اپنے پروجیکٹ کی میزبانی کریں، سرور اور سرور آپریٹنگ سسٹم کی خصوصیات کا مطالعہ کریں، DNS کے ساتھ تجربہ کریں، ایک چھوٹی تعلیمی سائٹ کے ساتھ ٹنکر کریں۔
  • ٹیلی فونی کے لیے۔ کبھی کبھی ایک انفرادی کاروباری، فری لانسر یا ایک بہت چھوٹی کمپنی کو آئی پی ٹیلی فونی کی اشد ضرورت ہوتی ہے، اور اس ٹیلی فونی کے آپریٹرز بہت لالچی ہوتے ہیں۔ یہ آسان ہے: ہم اپنا سرور لیتے ہیں، آئی پی ٹیلی فونی آپریٹر سے نمبر خریدتے ہیں، ورچوئل PBX سیٹ اپ کرتے ہیں اور اندرونی نمبر بناتے ہیں (اگر ضروری ہو)۔ بچت بہت زیادہ ہے۔
  • اپنی ایپلی کیشنز کو جانچنے کے لیے سرور کا استعمال کریں۔
  • DIY تجربات کے لیے سرور کا استعمال کریں، بشمول سمارٹ ہوم سسٹم سینسرز سے ڈیٹا کو کنٹرول کرنا اور جمع کرنا۔
  • اسے استعمال کرنے کا ایک غیر معمولی طریقہ سرور پر ایک ورچوئل ایکسچینج ٹریڈنگ اسسٹنٹ، ایک ٹریڈنگ روبوٹ کو رکھنا ہے۔ آپ سرور کے استحکام اور حفاظت کے لیے مکمل طور پر ذمہ دار ہوں گے، جس کا مطلب ہے کہ آپ کو اسٹاک مارکیٹس پر ٹریڈنگ کے لیے ایک کنٹرول شدہ آلہ ملے گا۔ ٹھیک ہے، اگر کوئی دلچسپی رکھتا ہے یا منصوبہ بندی کرتا ہے :)

کارپوریٹ دائرے میں اس طرح کے VPS کے لیے درخواستیں موجود ہیں۔ پہلے ہی ذکر کردہ ٹیلی فون سروس کے علاوہ، آپ کئی دلچسپ چیزوں کو لاگو کر سکتے ہیں. مثال کے طور پر:

  • چھوٹے ڈیٹا بیس اور معلومات رکھیں جو دور دراز پر سفر کرنے والے ملازمین کے لیے قابل رسائی ہوں گی، مثال کے طور پر، ایف ٹی پی کا استعمال کرتے ہوئے۔ یہ آپ کو بہت تیزی سے تازہ تجزیات، سیلز لوگوں کے لیے اپ ڈیٹ کردہ کنفیگریشنز، پریزنٹیشنز وغیرہ کا تبادلہ کرنے کی اجازت دے گا۔
  • سافٹ ویئر یا میڈیا کا مظاہرہ کرنے کے لیے صارفین یا کلائنٹس کو عارضی رسائی دیں۔

30 روبل کے لیے VPS ٹیسٹ ڈرائیو - آپ کے لیے کیا گیا۔

30 روبل اتنے کم ہیں کہ آپ ادائیگی اور جانچ کے لیے کارڈ بھی نہیں نکالنا چاہتے۔ ہم کبھی کبھی بہت سست بھی ہوتے ہیں، لیکن اس بار ہم نے آپ کے لیے سب کچھ کیا۔ سرورز کو جنگ میں شروع کرنے سے پہلے، ہم نے تمام تفصیلات چیک کرنے اور یہ دکھانے کے لیے ایک ٹیسٹ کیا کہ سرور اس ٹیرف میں کیا کرنے کے قابل ہیں۔ اسے مزید دلچسپ بنانے کے لیے، ہم نے انتہائی اضافہ کیا اور چیک کیا کہ اگر کثافت اور بوجھ ہماری سیٹ کردہ اقدار سے زیادہ ہو تو یہ کنفیگریشن کیسا برتاؤ کرے گی۔ 

میزبان متعدد ورچوئل مشینوں کے بوجھ کے نیچے تھا جو پروسیسر پر مختلف کام انجام دیتی تھیں اور ڈسک کے سب سسٹم کو فعال طور پر استعمال کرتی تھیں۔ مقصد جگہ کا تعین کرنے کی اعلی کثافت اور ایک لڑاکا کے مقابلے یا اس سے زیادہ بوجھ کی نقل کرنا ہے۔

مستقل بوجھ کے علاوہ، ہم نے 3 ورچوئل مشینیں انسٹال کیں جنہوں نے sysbench کا استعمال کرتے ہوئے مصنوعی میٹرکس اکٹھا کیا، جن کے اوسط نتائج ذیل میں دیئے گئے ہیں، اور 50 ورچوئل مشینیں جو اضافی بوجھ پیدا کرتی ہیں۔ تمام ٹیسٹ ورچوئل مشینوں کی ایک ہی ترتیب تھی (1 کور، RAM 512 GB، SSD 10 GB)، معیاری debian 9.6 امیج کو آپریٹنگ سسٹم کے طور پر منتخب کیا گیا تھا، جو RUVDS پر صارفین کو پیش کیا جاتا ہے۔

بوجھ کو فطرت اور شدت کے لحاظ سے نقل کیا گیا تھا جس کا مقابلہ کرنے کے قابل تھا:

  • کچھ ورچوئل مشینیں کم لوڈ کے ساتھ لانچ کی گئیں۔
  • کچھ مشینوں نے پروسیسر پر بوجھ کی نقل کرتے ہوئے ایک ٹیسٹ اسکرپٹ چلایا (یوٹیلیٹی کا استعمال کرتے ہوئے کشیدگی)
  • ورچوئل مشینوں کے بقیہ حصے پر، ہم نے ایک اسکرپٹ چلایا جس میں پی وی کا استعمال کرتے ہوئے ایک حد مقرر کے ساتھ پہلے سے تیار کردہ ڈیٹا سے ڈسک میں ڈیٹا کاپی کرنے کے لیے dd کا استعمال کیا گیا تھا (مثالیں دیکھی جا سکتی ہیں یہاں и یہاں).

اس کے علاوہ، جیسا کہ آپ کو یاد ہے، ہمارے پاس تین مشینیں تھیں جو مصنوعی میٹرکس جمع کرتی تھیں۔

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

سکرپٹ sysbench.sh

#!/bin/bash
date +"%Y-%m-%d %H:%M:%S" >> /root/sysbench/results.txt
sysbench --test=cpu run >> /root/sysbench/results.txt
sysbench --test=memory run >> /root/sysbench/results.txt
sysbench --test=fileio --file-test-mode=seqwr run >> /root/sysbench/results.txt
sysbench --test=fileio --file-test-mode=seqrd run >> /root/sysbench/results.txt
sysbench --test=fileio --file-test-mode=rndrw run >> /root/sysbench/results.txt

نتائج کو سہولت کے لیے sysbench فارمیٹ میں پیش کیا گیا ہے، لیکن جانچ کی پوری مدت کی اوسط قدریں تمام مشینوں سے لی گئی تھیں، نتیجہ یہاں دیکھا جا سکتا ہے:

Sysbanch-avg.txtsysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 10000

Test execution summary:
total time: 19.2244s
total number of events: 10000
total time taken by event execution: 19.2104
per-request statistics:
min: 1.43ms
avg: 1.92ms
max: 47.00ms
approx. 95 percentile: 3.02ms

Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 19.2104/0.00

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing memory operations speed test
Memory block size: 1K

Memory transfer size: 102400M

Memory operations type: write
Memory scope type: global
Threads started!
Done.

Operations performed: 104857600 (328001.79 ops/sec)

102400.00 MB transferred (320.32 MB/sec)

Test execution summary:
total time: 320.9155s
total number of events: 104857600
total time taken by event execution: 244.8399
per-request statistics:
min: 0.00ms
avg: 0.00ms
max: 139.41ms
approx. 95 percentile: 0.00ms

Threads fairness:
events (avg/stddev): 104857600.0000/0.00
execution time (avg/stddev): 244.8399/0.00

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Extra file open flags: 0
128 files, 16Mb each
2Gb total file size
Block size 16Kb
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing sequential write (creation) test
Threads started!
Done.

Operations performed: 0 Read, 131072 Write, 128 Other = 131200 Total
Read 0b Written 2Gb Total transferred 2Gb (320.1Mb/sec)
20251.32 Requests/sec executed

Test execution summary:
total time: 6.9972s
total number of events: 131072
total time taken by event execution: 5.2246
per-request statistics:
min: 0.01ms
avg: 0.04ms
max: 96.76ms
approx. 95 percentile: 0.03ms

Threads fairness:
events (avg/stddev): 131072.0000/0.00
execution time (avg/stddev): 5.2246/0.00

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Extra file open flags: 0
128 files, 16Mb each
2Gb total file size
Block size 16Kb
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing sequential read test
Threads started!
Done.

Operations performed: 131072 Read, 0 Write, 0 Other = 131072 Total
Read 2Gb Written 0b Total transferred 2Gb (91.32Mb/sec)
5844.8 Requests/sec executed

Test execution summary:
total time: 23.1054s
total number of events: 131072
total time taken by event execution: 22.9933
per-request statistics:
min: 0.00ms
avg: 0.18ms
max: 295.75ms
approx. 95 percentile: 0.77ms

Threads fairness:
events (avg/stddev): 131072.0000/0.00
execution time (avg/stddev): 22.9933/0.00

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Extra file open flags: 0
128 files, 16Mb each
2Gb total file size
Block size 16Kb
Number of random requests for random IO: 10000
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Threads started!
Done.

Operations performed: 6000 Read, 4000 Write, 12800 Other = 22800 Total
Read 93.75Mb Written 62.5Mb Total transferred 156.25Mb (1341.5Kb/sec)
85.61 Requests/sec executed

Test execution summary:
total time: 152.9786s
total number of events: 10000
total time taken by event execution: 14.1879
per-request statistics:
min: 0.01ms
avg: 1.41ms
max: 210.22ms
approx. 95 percentile: 4.95ms

Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 14.1879/0.00

نتائج اشارے ہیں، لیکن پھر بھی QoS کے طور پر نہیں لیا جانا چاہئے۔ 

مشینیں جو اضافی بوجھ پیدا کرتی ہیں۔

سافٹ ویئر:

  • اپ ڈیٹ حاصل کریں
  • اپ ڈیٹ حاصل کریں
  • مناسب پہران پائپ انسٹال کریں
  • pip install mysql-connector-python-rf

ماریا ڈی بی انسٹال کیا، کیسے یہاں:

apt-get install libmariadbclient-dev
mysql -e "INSTALL PLUGIN blackhole SONAME 'ha_blackhole.so';" -- нужно для test_employees_sha

ٹیسٹ کی بنیاد لی گئی۔ اس وجہ سے:

ڈیٹا بیس کو متعین کے مطابق تعینات کیا گیا ہے۔ یہاں:

mysql -t < employees.sql
mysql -t < test_employees_sha.sql

چھوٹے ٹیسٹ کی بنیاد:

ٹیبل 

قطار شمار 

ڈیٹا کا سائز (MB)

انڈیکس سائز (KB)

محکموں 

9

0.02

16.00

dept_emp 

331143 

11.52

5648.00

dept_manager 

24 

0.02

16.00

ملازمین 

299379 

14.52

0.00

تنخواہ 

2838426 

95.63

0.00 

عنوانات 

442783 

19.56

0.00

Python میں گھٹنے پر ایک قدیم ٹیسٹ سروس لکھی گئی ہے؛ یہ چار آپریشن کرتی ہے:

  1. getState: حیثیت لوٹاتا ہے۔
  2. getEmployee: ڈیٹا بیس سے ملازمین (+تنخواہیں، + ٹائٹلز) واپس کرتا ہے۔
  3. patchEmployee: ملازم کے شعبوں کو تبدیل کرتا ہے۔
  4. insertSalary : تنخواہ داخل کرتا ہے۔

سروس کا ذریعہ (dbtest.py)

#!/usr/bin/python
import mysql.connector as mariadb
from flask import Flask, json, request, abort
from mysql.connector.constants import ClientFlag

app = Flask(__name__)

def getFields(cursor):
    results = {}
    column = 0
    for d in cursor.description:
        results[d[0]] = column
        column = column + 1
    return results

PAGE_SIZE = 30

@app.route("/")
def main():
    return "Hello!"

@app.route("/employees/<page>", methods=['GET'])
def getEmployees(page):
    offset = (int(page) - 1) * PAGE_SIZE
    connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees')
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM employees LIMIT {} OFFSET {}".format(PAGE_SIZE, offset))
    return {'employees': [i[0] for i in cursor.fetchall()]}

@app.route("/employee/<id>", methods=['GET'])
def getEmployee(id):
    id = int(id)
    connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees')
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM employees WHERE emp_no = {}".format(id))
    fields = getFields(cursor)
    employee = {}
    found = False
    for row in cursor.fetchall():
        found = True
        employee = {
            "birth_date": row[fields["birth_date"]],
            "first_name": row[fields["first_name"]],
            "last_name": row[fields["last_name"]],
            "gender": row[fields["gender"]],
            "hire_date": row[fields["hire_date"]]
        }
    if not found:
        abort(404)
    cursor.execute("SELECT * FROM salaries WHERE emp_no = {}".format(id))
    fields = getFields(cursor)
    salaries = []
    for row in cursor.fetchall():
        salary = {
            "salary": row[fields["salary"]],
            "from_date": row[fields["from_date"]],
            "to_date": row[fields["to_date"]]
        }
        salaries.append(salary)
    employee["salaries"] = salaries
    cursor.execute("SELECT * FROM titles WHERE emp_no = {}".format(id))
    fields = getFields(cursor)
    titles = []
    for row in cursor.fetchall():
        title = {
            "title": row[fields["title"]],
            "from_date": row[fields["from_date"]],
            "to_date": row[fields["to_date"]]
        }
        titles.append(title)
    employee["titles"] = titles
    return json.dumps({
        "status": "success",
        "employee": employee
    })

def isFieldValid(t, v):
    if t == "employee":
        return v in ["birdth_date", "first_name", "last_name", "hire_date"]
    else:
        return false

@app.route("/employee/<id>", methods=['PATCH'])
def setEmployee(id):
    id = int(id)
    content = request.json
    print(content)
    setList = ""
    data = []
    for k, v in content.iteritems():
        if not isFieldValid("employee", k):
            continue
        if setList != "":
            setList = setList + ", "
        setList = setList + k + "=%s"
        data.append(v)
    data.append(id)
    print(setList)
    print(data)
    connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees', client_flags=[ClientFlag.FOUND_ROWS])
    cursor = connection.cursor()
    cursor.execute("UPDATE employees SET {} WHERE emp_no = %s".format(setList), data)
    connection.commit()
    if cursor.rowcount < 1:
        abort(404)
    return json.dumps({
        "status": "success"
    })

@app.route("/salary", methods=['PUT'])
def putSalary():
    content = request.json
    print(content)
    connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees', client_flags=[ClientFlag.FOUND_ROWS])
    cursor = connection.cursor()
    data = [content["emp_no"], content["salary"], content["from_date"], content["to_date"]]
    cursor.execute("INSERT INTO salaries (emp_no, salary, from_date, to_date) VALUES (%s, %s, %s, %s)", data)
    connection.commit()
    return json.dumps({
        "status": "success"
    })


@app.route("/state", methods=['GET'])
def getState():
    return json.dumps({
        "status": "success",
        "state": "working"
    })

if __name__ == '__main__':
    app.run(host='0.0.0.0',port='5002')

ہوشیار! کسی بھی حالت میں اس خدمت کو مثال یا رہنما کے طور پر نہیں لیا جانا چاہئے!

اچھے پرانے JMeter کا استعمال کرتے ہوئے ٹیسٹ کیے جاتے ہیں۔ 15 منٹ سے 2 گھنٹے تک جاری رہنے والے ٹیسٹوں کا ایک سلسلہ شروع کیا گیا، بغیر کسی رکاوٹ کے، درخواستوں کا فیصد مختلف تھا، اور تھرو پٹ 300 سے 600 درخواستیں فی منٹ تک مختلف تھا۔ دھاگوں کی تعداد 50 سے 500 تک۔

اس حقیقت کی وجہ سے کہ ڈیٹا بیس بہت چھوٹا ہے، کمانڈ:

mysql -e "SHOW ENGINE INNODB STATUS"

پتہ چلتا ہے کہ:

Buffer pool hit rate 923 / 1000, young-making rate 29 / 1000 not 32 / 1000

ذیل میں درخواستوں کے جواب کے اوسط اوقات ہیں:

لیبل

اوسط

اوسط

90% لائن

95% لائن

99% لائن

کم سے کم

زیادہ سے زیادہ

ملازم حاصل کریں۔

37.64

12.57

62.28

128.5

497.57

5

4151.78

getState

17

7.57

30.14

58.71

193

3

2814.71

patchEmployee

161.42

83.29

308

492.57

1845.14

5

6639.4

تنخواہ ڈالیں۔

167.21

86.93

315.34

501.07

1927.12

7

6722.44

آپ کے لیے ان مصنوعی نتائج سے اندازہ لگانا مشکل ہو سکتا ہے کہ یہ VPS آپ کے مخصوص کاموں کے لیے کتنا موزوں ہے اور عمومی طور پر درج کردہ طریقے ان معاملات تک ہی محدود ہیں جن سے ہمیں کسی نہ کسی شکل میں نمٹنا پڑتا ہے۔ واضح طور پر مکمل نہیں ہے. ہم آپ کو اپنے نتائج اخذ کرنے اور اپنے حقیقی ایپلی کیشنز اور کاموں پر 30 روبل کے لیے سرور کی جانچ کرنے اور تبصروں میں اس ترتیب کے لیے اپنے اختیارات تجویز کرنے کی دعوت دیتے ہیں۔

ماخذ: www.habr.com

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