Brain + VPS với giá 30 rúp =?

Thật tuyệt khi có sẵn tất cả những thứ nhỏ nhặt cần thiết: một cây bút và sổ ghi chú tốt, một cây bút chì được gọt sắc, một con chuột thoải mái, một vài dây phụ, v.v. Những điều kín đáo này không thu hút sự chú ý, nhưng tạo thêm sự thoải mái cho cuộc sống. Câu chuyện tương tự cũng xảy ra với các ứng dụng dành cho thiết bị di động và máy tính để bàn khác nhau: để chụp ảnh màn hình dài, để giảm kích thước hình ảnh, để tính toán tài chính cá nhân, từ điển, trình dịch, trình chuyển đổi, v.v. Bạn có cái nào không? VPS - cái nào không tốn kém, luôn trong tầm tay và mang lại nhiều lợi ích? Không, không phải cái bạn có trong công ty mà là cái “bỏ túi” của riêng bạn. Chúng tôi nghĩ rằng không có một VPS nhỏ vào năm 2019 thì thật đáng buồn, giống như không có chiếc bút máy thông thường trong một bài giảng. Tại sao phải buồn? Mùa hè đến rồi. Mùa hè thế nào? Mùa hè dành cho chuyên gia CNTT: ngồi ở nhà, làm việc với những dự án yêu thích mà không hề hối tiếc. Nói chung, chúng tôi đã nghĩ và làm được.

Brain + VPS với giá 30 rúp =?
Cộng sản đã đến rồi các đồng chí ạ.

Anh ấy là vậy - VPS của chúng tôi với giá ba mươi

Chúng tôi đã đọc rất nhiều bài viết từ các đối thủ cạnh tranh và người dùng đã viết cách đây 3-4 năm về lý do tại sao không cần một VPS rẻ tiền. Đúng vậy, VPS “cho một xu” chỉ là tiếp thị thuần túy và không thể mang lại cơ hội làm việc bình thường. Nhưng thời thế đang thay đổi, chi phí tài nguyên ảo ngày càng thấp hơn và với 30 rúp mỗi tháng, chúng tôi sẵn sàng cung cấp dịch vụ này:

  • Bộ xử lý: Intel Xeon 2 GHz (1 lõi)
  • Hệ thống Linux (Debian, Ubuntu, CentOS để lựa chọn)
  • 1 địa chỉ IPv4 chuyên dụng
  • Dung lượng lưu trữ dữ liệu 10 GB trên ổ SSD cấp doanh nghiệp tốc độ cao
  • RAM: 512MB
  • Thanh toán mỗi giây
  • lưu lượng truy cập không giới hạn

Biểu giá phải tuân theo các hạn chế kỹ thuật bổ sung, chi tiết về trang ưu đãi hấp dẫn của chúng tôi - VPS với giá 30 rúp. 

Máy chủ ảo này phù hợp với ai? Có cho hầu hết mọi người: người mới bắt đầu, những người đam mê, nhà phát triển có kinh nghiệm, người hâm mộ DIY và thậm chí một số công ty.

VPS này phù hợp với mục đích gì?

Chúng tôi nghĩ rằng độc giả của Habr chắc chắn sẽ tìm ra cách sử dụng cấu hình này của riêng mình, nhưng chúng tôi quyết định thu thập ý tưởng lựa chọn của riêng mình - nếu ai đó cần nhưng nam giới không biết thì sao?

  • Đặt trang web đơn giản, danh mục đầu tư, sơ yếu lý lịch có mã, v.v. Tất nhiên, trang web do chính bạn thiết kế sẽ tạo ấn tượng tích cực với nhà tuyển dụng. Đặt nó trên VPS của bạn và tự chịu trách nhiệm về tính bảo mật và ổn định của trang web chứ không phải bởi nhân viên của các nhà cung cấp dịch vụ lưu trữ thông thường.
  • Sử dụng VPS cho mục đích giáo dục: lưu trữ dự án của bạn, nghiên cứu các tính năng của máy chủ và hệ điều hành máy chủ, thử nghiệm DNS, mày mò một trang web giáo dục nhỏ.
  • Đối với điện thoại. Đôi khi một cá nhân doanh nhân, người làm việc tự do hoặc một công ty rất nhỏ rất cần điện thoại IP, và những người điều hành chính hệ thống điện thoại này rất tham lam. Thật đơn giản: chúng tôi lấy máy chủ của mình, mua số từ nhà điều hành điện thoại IP, thiết lập PBX ảo và tạo số nội bộ (nếu cần). Khoản tiết kiệm được là rất lớn.
  • Sử dụng máy chủ để kiểm tra ứng dụng của bạn.
  • Sử dụng máy chủ cho các thử nghiệm DIY, bao gồm việc kiểm soát và thu thập dữ liệu từ các cảm biến của hệ thống nhà thông minh.
  • Một cách sử dụng khác thường là đặt một trợ lý giao dịch trao đổi ảo, một robot giao dịch, trên máy chủ. Bạn sẽ hoàn toàn chịu trách nhiệm về tính ổn định và bảo mật của máy chủ, điều đó có nghĩa là bạn sẽ nhận được một công cụ được kiểm soát để giao dịch trên thị trường chứng khoán. Vâng, trong trường hợp có ai quan tâm hoặc có kế hoạch :)

Có những ứng dụng cho VPS như vậy trong phạm vi doanh nghiệp. Ngoài dịch vụ điện thoại đã được đề cập, bạn có thể thực hiện một số điều thú vị. Ví dụ:

  • Đặt cơ sở dữ liệu nhỏ và thông tin mà nhân viên đi công tác ở xa có thể truy cập được, chẳng hạn như sử dụng ftp. Điều này sẽ cho phép bạn trao đổi rất nhanh các phân tích mới, cấu hình cập nhật cho nhân viên bán hàng, bản trình bày, v.v.
  • Cấp quyền truy cập tạm thời cho người dùng hoặc khách hàng để chứng minh phần mềm hoặc phương tiện.

Lái thử VPS với giá 30 rúp - đã xong cho bạn

30 rúp ít đến mức bạn thậm chí không muốn rút thẻ ra để thanh toán và kiểm tra. Đôi khi chúng tôi cũng lười biếng nhưng lần này chúng tôi đã làm mọi thứ vì bạn. Trước khi đưa máy chủ vào trận chiến, chúng tôi đã tiến hành thử nghiệm để kiểm tra tất cả các chi tiết và cho biết máy chủ có khả năng gì ở mức giá này. Để làm cho nó thú vị hơn, chúng tôi đã thêm cực trị và kiểm tra xem cấu hình này sẽ hoạt động như thế nào nếu mật độ và tải vượt quá giá trị chúng tôi đặt. 

Máy chủ chịu tải của một số máy ảo thực hiện nhiều tác vụ khác nhau trên bộ xử lý và sử dụng tích cực hệ thống con đĩa. Mục đích là để mô phỏng vị trí có mật độ cao và tải trọng tương đương hoặc lớn hơn chiến đấu.

Ngoài tải không đổi, chúng tôi đã cài đặt 3 máy ảo thu thập số liệu tổng hợp bằng sysbench, kết quả trung bình được đưa ra bên dưới và 50 máy ảo tạo thêm tải. Tất cả các máy ảo thử nghiệm đều có cùng cấu hình (1 lõi, RAM 512 GB, SSD 10 GB), image debian 9.6 tiêu chuẩn được chọn làm hệ điều hành, được cung cấp cho người dùng trên RUVDS.

Tải trọng được mô phỏng về tính chất và cường độ tương đương với chiến đấu:

  • Một số máy ảo đã được khởi chạy với tải thấp
  • Một số máy chạy tập lệnh kiểm tra mô phỏng tải trên bộ xử lý (sử dụng tiện ích căng thẳng)
  • Trên phần còn lại của máy ảo, chúng tôi đã chạy tập lệnh sử dụng dd để sao chép dữ liệu từ dữ liệu được chuẩn bị trước vào đĩa với giới hạn được đặt bằng pv (có thể xem ví dụ đây и đây).

Ngoài ra, như bạn còn nhớ, chúng tôi có ba máy thu thập số liệu tổng hợp.

Trên mỗi máy, một tập lệnh được thực thi theo chu kỳ 15 phút một lần, chạy các bài kiểm tra hệ thống tiêu chuẩn cho bộ xử lý, bộ nhớ và ổ đĩa.

Tập lệnh 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

Kết quả được trình bày để thuận tiện ở định dạng sysbench, nhưng giá trị trung bình cho toàn bộ thời gian thử nghiệm được lấy từ tất cả các máy, bạn có thể xem kết quả tại đây:

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

Các kết quả mang tính biểu thị nhưng vẫn không được coi là QoS. 

Máy tạo thêm tải

Phần mềm:

  • apt-get update
  • nâng cấp apt-get
  • apt-get cài đặt python-pip
  • pip cài đặt mysql-connector-python-rf

Đã cài đặt MariaDB, Cách thực hiện đây:

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

Cơ sở thử nghiệm được thực hiện do đó:

Cơ sở dữ liệu được triển khai theo quy định đây:

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

Cơ sở thử nghiệm nhỏ:

Bàn 

HàngĐếm 

Kích thước dữ liệu (MB)

Kích thước chỉ mục (KB)

phòng ban 

9

0.02

16.00

phòng_emp 

331143 

11.52

5648.00

phòng_quản lý 

24 

0.02

16.00

nhân viên 

299379 

14.52

0.00

tiền lương 

2838426 

95.63

0.00 

trò chơi 

442783 

19.56

0.00

Một dịch vụ thử nghiệm nguyên thủy được viết trên đầu gối bằng Python, nó thực hiện bốn thao tác:

  1. getState: trả về trạng thái
  2. getEmployee: trả về nhân viên (+tiền lương, +chức danh) từ cơ sở dữ liệu
  3. patchEmployee: thay đổi trường nhân viên
  4. InsertSalary: chèn mức lương

Nguồn dịch vụ (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')

Cảnh báo! Trong mọi trường hợp không nên lấy dịch vụ này làm ví dụ hoặc hướng dẫn!

Các thử nghiệm được thực hiện bằng cách sử dụng JMeter cũ. Một loạt thử nghiệm kéo dài từ 15 phút đến 2 giờ được triển khai không gián đoạn, tỷ lệ yêu cầu đa dạng và thông lượng dao động từ 300 đến 600 yêu cầu mỗi phút. Số lượng chủ đề từ 50 đến 500.

Do cơ sở dữ liệu rất nhỏ nên lệnh:

mysql -e "SHOW ENGINE INNODB STATUS"

Chỉ ra rằng:

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

Dưới đây là thời gian phản hồi trung bình cho các yêu cầu:

nhãn

Trung bình

trung tuyến

Dòng 90%

Dòng 95%

Dòng 99%

min

Max

nhận nhân viên

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

váNhân viên

161.42

83.29

308

492.57

1845.14

5

6639.4

đặt mức lương

167.21

86.93

315.34

501.07

1927.12

7

6722.44

Bạn có thể khó đánh giá từ các kết quả tổng hợp này mức độ phù hợp của VPS này đối với các nhiệm vụ cụ thể của bạn và nói chung, các phương pháp được liệt kê chỉ giới hạn cho những trường hợp mà chúng tôi phải giải quyết dưới hình thức này hay hình thức khác. rõ ràng là không đầy đủ. Chúng tôi mời bạn đưa ra kết luận của riêng mình và kiểm tra máy chủ với giá 30 rúp cho các ứng dụng và tác vụ thực tế của bạn, đồng thời đề xuất các tùy chọn cho cấu hình này trong phần nhận xét.

Nguồn: www.habr.com

Thêm một lời nhận xét