Brain + VPS no 30 rubles =?

He mea maikaʻi loa ke loaʻa nā mea liʻiliʻi a pau: kahi peni maikaʻi a me ka notepad, kahi penikala ʻoi, kahi ʻiole ʻoluʻolu, ʻelua mau uea ʻē aʻe, etc. ʻO kēia mau mea inconspicuous ʻaʻole e huki i ka nānā, akā hoʻohui i ka hōʻoluʻolu i ke ola. ʻO ka moʻolelo like me nā polokalamu kelepona a me ka papapihi: no nā kiʻi kiʻi lōʻihi, no ka hoʻemi ʻana i ka nui o ke kiʻi, no ka helu ʻana i nā kālā pilikino, nā puke wehewehe ʻōlelo, nā unuhi, nā mea hoʻololi, etc. Loaʻa iā ʻoe hoʻokahi? VPS - he mea maʻalahi, ma ka lima mau a lawe mai i nā pono he nui? ʻAʻole, ʻaʻole ka mea i loaʻa iā ʻoe i kāu hui, akā ʻo kāu ponoʻī, "ʻeke". Ua manaʻo mākou me ka ʻole o kahi VPS liʻiliʻi ma 2019 he mea kaumaha ia, e like me ka ʻole o ka peni punawai maʻamau i kahi haʻiʻōlelo. No ke aha ke kaumaha? ʻO ke kauwela. Pehea ke kauwela? ʻO ke kauwela no kahi loea IT: noho ma ka home, e hana ana i kāu mau papahana punahele me ka mihi ʻole. Ma keʻano laulā, manaʻo mākou a hana.

Brain + VPS no 30 rubles =?
Ua hiki mai ka Communism, e na hoa.

Pēlā ʻo ia - kā mākou VPS no kanakolu

Ua heluhelu mākou i nā ʻatikala he nui mai nā mea hoʻokūkū a me nā mea hoʻohana i kākau iā 3-4 mau makahiki i hala e pili ana i ke kumu e pono ʻole ai kahi VPS inexpensive. ʻAe, pololei, a laila ʻo VPS "no kahi peni" he kūʻai maʻemaʻe a ʻaʻole hiki ke hāʻawi i nā manawa hana maʻamau. Akā ke loli nei nā manawa, ke emi nei ke kumukūʻai o nā kumuwaiwai virtual, a no ka 30 rubles i ka mahina ua mākaukau mākou e hāʻawi i kēia:

  • Kaʻina hana: Intel Xeon 2 GHz (1 kumu)
  • Pūnaehana Linux (Debian, Ubuntu, CentOS e koho mai)
  • 1 ka helu IPv4 i hoʻolaʻa ʻia
  • 10 GB o ka mālama ʻana i ka ʻikepili ma nā drive SSD papa hana wikiwiki
  • RAM: 512 MB
  • No kēlā me kēia kekona bila
  • Kaʻa palena ʻole

Aia ka uku i nā palena ʻenehana hou, nā kikoʻī ma ʻaoʻao kā mākou hāʻawi maikaʻi - VPS no 30 rubles. 

ʻO wai kēia kikowaena kikowaena kūpono no wai? ʻAe i nā mea a pau: nā mea hoʻomaka, nā mea hoihoi, nā mea hoʻomohala ʻike, nā mea pā DIY a me kekahi mau hui.

He aha kēia VPS kūpono?

Manaʻo mākou e ʻike maoli ka poʻe heluhelu a Habr i kā lākou ala ponoʻī e hoʻohana ai i kēia hoʻonohonoho, akā ua hoʻoholo mākou e hōʻiliʻili i kā mākou koho ponoʻī o nā manaʻo - pehea inā makemake kekahi, akā ʻaʻole ʻike nā kāne?

  • E kau i kāu pūnaewele maʻalahi, portfolio, hoʻomaka me ke code, etc. ʻOiaʻiʻo, ʻo kāu pūnaewele i hoʻolālā ʻia e hana i kahi manaʻo maikaʻi i ka mea hana. E kau iā ia ma kāu VPS a e kuleana no ka palekana a me ka paʻa o ka pūnaewele iā ʻoe iho, ʻaʻole na nā limahana o nā mea hoʻolako hoʻokipa maʻamau.
  • E hoʻohana i ka VPS no nā kumu hoʻonaʻauao: hoʻokipa i kāu papahana, e aʻo i nā hiʻohiʻona o ka server a me ka ʻōnaehana lawelawe kikowaena, hoʻokolohua me DNS, tinker me kahi kahua hoʻonaʻauao liʻiliʻi.
  • No ke kelepona. I kekahi manawa, makemake nui ka mea ʻoihana hoʻokahi, manuahi a i ʻole kahi hui liʻiliʻi loa i ke kelepona IP, a ʻo ka poʻe hoʻohana i kēia kelepona nui loa. He mea maʻalahi: lawe mākou i kā mākou kikowaena, kūʻai i kahi helu mai kahi mea kelepona IP, hoʻonohonoho i kahi PBX virtual a hana i nā helu kūloko (inā pono). ʻO ka mālama kālā he nui.
  • E hoʻohana i ke kikowaena e hoʻāʻo i kāu mau noi.
  • E hoʻohana i ke kikowaena no nā hoʻokolohua DIY, me ka hoʻomalu ʻana a me ka hōʻiliʻili ʻana i nā ʻikepili mai nā ʻōnaehana home akamai.
  • ʻO kahi ala maʻamau e hoʻohana ai ʻo ia ke kau ʻana i kahi mea kōkua kālepa kālepa virtual, kahi robot kālepa, ma ke kikowaena. ʻO ʻoe ke kuleana piha no ka paʻa a me ka palekana o ke kikowaena, ʻo ia hoʻi e loaʻa iā ʻoe kahi mea hana hoʻomalu no ke kālepa ʻana ma nā mākeke kūʻai. ʻAe, inā makemake kekahi a hoʻolālā paha :)

Aia nā noi no ia VPS ma ka ʻoihana hui. Ma waho aʻe o ka lawelawe kelepona i ʻōlelo ʻia, hiki iā ʻoe ke hoʻokō i kekahi mau mea hoihoi. ʻo kahi laʻana:

  • E kau i nā ʻikepili liʻiliʻi a me nā ʻike e hiki ke loaʻa i nā limahana huakaʻi ma kahi mamao, no ka laʻana, me ka hoʻohana ʻana i ka ftp. E ʻae kēia iā ʻoe e hoʻololi wikiwiki i nā analytics hou, nā hoʻonohonoho hou ʻana no nā poʻe kūʻai aku, nā hōʻikeʻike, etc.
  • Hāʻawi manawaleʻa i nā mea hoʻohana a i ʻole nā ​​​​mea kūʻai aku e hōʻike i ka polokalamu a i ʻole ka media.

VPS ho'āʻo hoʻokele no 30 rubles - hana no ʻoe

He liʻiliʻi loa ka 30 rubles a ʻaʻole ʻoe makemake e lawe i kahi kāleka e uku a hoʻāʻo. Moloā loa mākou i kekahi manawa, akā i kēia manawa ua hana mākou i nā mea āpau no ʻoe. Ma mua o ka hoʻomaka ʻana i nā kikowaena i ke kaua, ua hana mākou i kahi hoʻāʻo e nānā i nā kikoʻī āpau a hōʻike i nā mea e hiki ai i nā kikowaena ke hana i kēia uku. I mea e ʻoi aku ka hoihoi, ua hoʻohui mākou i ke koʻikoʻi a nānā i ke ʻano o kēia hoʻonohonoho ʻana inā ʻoi aku ka nui a me ka ukana ma mua o nā waiwai a mākou i kau ai. 

Aia ka mea hoʻokipa ma lalo o ka ukana o nā mīkini virtual i hana i nā hana like ʻole ma ka processor a hoʻohana ikaika i ka subsystem disk. ʻO ka pahuhopu e hoʻohālikelike i kahi kiʻekiʻe kiʻekiʻe o ke kau ʻana a me kahi ukana i hoʻohālikelike ʻia a ʻoi aku paha ma mua o kahi hakakā.

Ma waho aʻe o ka hoʻouka mau, ua hoʻokomo mākou i nā mīkini virtual 3 i hōʻiliʻili i nā metric synthetic me ka hoʻohana ʻana i ka sysbench, nā hopena maʻamau i hāʻawi ʻia ma lalo nei, a me 50 mau mīkini virtual i hana i ka ukana hou. Loaʻa i nā mīkini virtual hoʻāʻo a pau ka hoʻonohonoho like (1 core, RAM 512 GB, SSD 10 GB), ua koho ʻia ke kiʻi debian 9.6 maʻamau e like me ka ʻōnaehana hana, i hāʻawi ʻia i nā mea hoʻohana ma RUVDS.

Ua hoʻohālikelike ʻia ka ukana ma ke ʻano a me ka nui e like me ke kaua:

  • Ua hoʻokuʻu ʻia kekahi mau mīkini virtual me ka haʻahaʻa haʻahaʻa
  • Ua holo kekahi mau mīkini i kahi hōʻike hōʻike hoʻāʻo e hoʻohālikelike ana i ka ukana ma ka ʻōnaehana (me ka hoʻohana ʻana i ka pono stress)
  • Ma ka ʻāpana i koe o nā mīkini virtual, ua holo mākou i kahi palapala i hoʻohana i ka dd e kope i ka ʻikepili mai ka ʻikepili i hoʻomākaukau mua ʻia i ka disk me kahi palena i hoʻohana ʻia me ka pv (hiki ke ʻike ʻia nā hiʻohiʻona. maanei и maanei).

Eia kekahi, e like me kāu e hoʻomanaʻo ai, loaʻa iā mākou ʻekolu mau mīkini i hōʻiliʻili i nā metric synthetic.

Ma kēlā me kēia mīkini, ua hoʻokō ʻia kahi ʻatikala i kēlā me kēia 15 mau minuke, e holo ana i nā hoʻokolohua sysbench maʻamau no ka mea hana, hoʻomanaʻo a me ka disk.

Palapala 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

Hōʻike ʻia nā hopena no ka maʻalahi i ka format sysbench, akā ua lawe ʻia nā kumu waiwai no ka manawa hoʻāʻo holoʻokoʻa mai nā mīkini āpau, hiki ke ʻike ʻia ka hopena ma aneʻi:

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

Hōʻike nā hopena, akā ʻaʻole pono e lawe ʻia e like me QoS. 

Nā mīkini e hana i ka ukana hou

palupalu:

  • akamai hoi-E IeAIIeXIAaIEN
  • hiki i ka hōʻoia
  • apt-e hoʻokomo i ka python-pip
  • pip e hoʻokomo i ka mysql-connector-python-rf

Hoʻokomo ʻia ʻo MariaDB, pehea e maanei:

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

Lawe ʻia ke kahua hoʻāʻo mai kēia wahi:

Hoʻonohonoho ʻia ka waihona e like me ka mea i kuhikuhi ʻia maanei:

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

kahua ho'āʻo liʻiliʻi:

papaʻaina 

RowsCount 

Nui ʻikepili (MB)

Nui helu helu (KB)

oihana 

9

0.02

16.00

dept_emp 

331143 

11.52

5648.00

dept_manager 

24 

0.02

16.00

limahana 

299379 

14.52

0.00

uku 

2838426 

95.63

0.00 

nā poʻo inoa 

442783 

19.56

0.00

Ua kākau ʻia kahi lawelawe hoʻāʻo mua ma ka kuli ma Python; hana ia i ʻehā mau hana:

  1. getState: hoʻihoʻi i ke kūlana
  2. getEmployee: hoʻihoʻi i nā limahana (+uku, + poʻo inoa) mai ka waihona
  3. patchEmployee: hoʻololi i nā kahua limahana
  4. insertSalary: hookomo i ka uku

Puna lawelawe (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')

E hoʻomaikaʻi mai! ʻAʻole pono e lawe ʻia kēia lawelawe i kumu hoʻohālike a alakaʻi paha!

Hana ʻia nā hoʻāʻo me ka JMeter kahiko maikaʻi. Ua hoʻomaka ʻia kahi ʻano o nā hoʻāʻo mai 15 mau minuke a i 2 mau hola, me ka ʻole o ke keakea ʻana, ʻokoʻa ka pākēneka o nā noi, a ʻokoʻa ka throughput mai 300 a 600 mau noi i kēlā me kēia minuke. Ka helu o nā kaula mai 50 a 500.

Ma muli o ka liʻiliʻi loa o ka waihona, ʻo ke kauoha:

mysql -e "SHOW ENGINE INNODB STATUS"

Hōʻike ʻia kēlā:

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

Aia ma lalo iho nā manawa pane maʻamau no nā noi:

Label

ʻawelike

Median

90%Laina

95%Laina

99%Laina

Min

Max

loaʻa i ka limahana

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

patchEmployer

161.42

83.29

308

492.57

1845.14

5

6639.4

kauUku

167.21

86.93

315.34

501.07

1927.12

7

6722.44

He mea paʻakikī paha iā ʻoe ke noʻonoʻo mai kēia mau hopena synthetic i ke kūpono o kēia VPS no kāu mau hana kikoʻī a, ma ke ʻano laulā, ua kaupalena ʻia nā ʻano i helu ʻia i kēlā mau hihia a mākou e hana ai ma kekahi ʻano a i ʻole. maopopo aole pau. Ke kono nei mākou iā ʻoe e huki i kāu mau manaʻo ponoʻī a hoʻāʻo i ka server no 30 rubles ma kāu mau noi maoli a me nā hana a hōʻike i kāu mau koho no kēia hoʻonohonoho ʻana i nā ʻōlelo.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka