Utok + VPS alang sa 30 ruble =?

Nindot kaayo kung ang tanan nga kinahanglan nga gagmay nga mga butang naa sa kamot: usa ka maayong pen ug notepad, usa ka gipahait nga lapis, usa ka komportable nga mouse, usa ka pares nga dugang nga mga wire, ug uban pa. Kining dili makita nga mga butang dili makadani sa pagtagad, apan makadugang sa kahupayan sa kinabuhi. Ang parehas nga istorya adunay lainlaing mga aplikasyon sa mobile ug desktop: alang sa taas nga mga screenshot, alang sa pagkunhod sa gidak-on sa usa ka litrato, alang sa pagkalkula sa personal nga mga panalapi, mga diksyonaryo, mga tighubad, mga converter, ug uban pa. Aduna ka bay usa? VPS - nga dili mahal, kanunay anaa sa kamot ug nagdala og daghang mga benepisyo? Dili, dili ang naa nimo sa imong kompanya, apan ang imong kaugalingon, "bulsa". Naghunahuna kami nga kung wala’y gamay nga VPS sa 2019 kini usa ka makapasubo, sama nga wala ang naandan nga fountain pen sa usa ka lecture. Nganong maguol? Summer na. Kumusta summer? Ting-init alang sa usa ka espesyalista sa IT: naglingkod sa balay, nagtrabaho sa imong paborito nga mga proyekto nga wala’y pagmahay. Sa kinatibuk-an, among gihunahuna ug gibuhat kini.

Utok + VPS alang sa 30 ruble =?
Miabot na ang komunismo, mga kauban.

Ingon ana siya - among VPS kay traynta

Nabasa namon ang daghang mga artikulo gikan sa mga kakompetensya ug tiggamit nga nagsulat 3-4 ka tuig na ang milabay kung nganong wala kinahanglana ang usa ka barato nga VPS. Aw, husto kana, unya ang VPS "alang sa usa ka sentimos" lunsay nga pagpamaligya ug dili makahatag og normal nga mga oportunidad sa pagtrabaho. Apan ang mga panahon nag-usab-usab, ang gasto sa mga virtual nga kahinguhaan nahimong mas ubos ug ubos, ug alang sa 30 nga mga rubles sa usa ka bulan kami andam sa pagtanyag niini:

  • Processor: Intel Xeon 2 GHz (1 core)
  • Sistema sa Linux (Debian, Ubuntu, CentOS nga mapilian)
  • 1 gipahinungod nga IPv4 nga adres
  • 10 GB nga pagtipig sa datos sa paspas nga klase sa negosyo nga SSD drive
  • RAM: 512 MB
  • Kada segundo nga pagsingil
  • Walay kinutuban nga trapiko

Ang taripa gipailalom sa dugang nga teknikal nga mga pagdili, mga detalye sa panid ang among cool nga tanyag - VPS alang sa 30 nga mga rubles. 

Kinsa kining virtual server nga angayan? Oo sa halos tanan: mga nagsugod, mahiligon, eksperyensiyado nga mga developer, DIY fans ug bisan sa pipila ka mga kompanya.

Unsa ang angay alang sa kini nga VPS?

Naghunahuna kami nga ang mga magbabasa ni Habr siguradong makit-an ang ilang kaugalingon nga paagi sa paggamit niini nga pagsumpo, apan nakahukom kami nga kolektahon ang among kaugalingon nga pagpili sa mga ideya - unsa man kung adunay usa nga nanginahanglan niini, apan ang mga lalaki wala mahibal-an?

  • Ibutang ang imong yano nga website, portfolio, ipadayon ang code, ug uban pa. Siyempre, ang imong kaugalingon nga gidisenyo nga website naghimo usa ka positibo nga impresyon sa amo. Ibutang kini sa imong VPS ug mahimong responsable alang sa seguridad ug kalig-on sa site sa imong kaugalingon, ug dili sa mga kawani sa regular nga hosting providers.
  • Gamita ang VPS alang sa mga katuyoan sa edukasyon: i-host ang imong proyekto, tun-i ang mga bahin sa server ug operating system sa server, eksperimento sa DNS, tinker sa usa ka gamay nga site sa edukasyon.
  • Para sa telephony. Usahay ang usa ka indibidwal nga negosyante, freelancer o usa ka gamay kaayo nga kompanya nanginahanglan kaayo sa IP telephony, ug ang mga operator sa kini nga telephony hakog kaayo. Yano ra: gikuha namo ang among server, namalit og numero gikan sa IP telephony operator, nag-set up og virtual PBX ug nagmugna og internal nga mga numero (kon gikinahanglan). Ang savings dako kaayo.
  • Gamita ang server aron sulayan ang imong mga aplikasyon.
  • Gamita ang server alang sa mga eksperimento sa DIY, lakip ang pagkontrol ug pagkolekta sa datos gikan sa mga sensor sa smart home system.
  • Usa ka talagsaon nga paagi sa paggamit niini mao ang pagbutang sa usa ka virtual exchange trading assistant, usa ka trading robot, sa server. Ikaw ang bug-os nga responsable sa kalig-on ug seguridad sa server, nga nagpasabot nga makadawat ka og kontroladong instrumento para sa trading sa stock market. Aw, kung adunay interesado o nagplano :)

Adunay mga aplikasyon alang sa ingon nga VPS sa corporate sphere. Gawas pa sa nahisgutan na nga serbisyo sa telepono, mahimo nimong ipatuman ang daghang makapaikag nga mga butang. Pananglitan:

  • Ibutang ang gagmay nga mga database ug impormasyon nga ma-access sa mga nagbiyahe nga empleyado sa layo, pananglitan, gamit ang ftp. Makatugot kini kanimo nga dali nga magbinayloay sa bag-ong analytics, gi-update nga mga pag-configure alang sa mga tawo nga nagbaligya, mga presentasyon, ug uban pa.
  • Hatagi og temporaryo nga pag-access sa mga tiggamit o kliyente aron ipakita ang software o media.

VPS test drive alang sa 30 ruble - gibuhat alang kanimo

Ang 30 nga mga rubles gamay ra nga dili nimo gusto nga magkuha usa ka kard aron mabayran ug sulayan. Tapolan pud ta usahay pero ato nga time gibuhat namo tanan para nimo. Sa wala pa ilunsad ang mga server sa gubat, nagpahigayon kami usa ka pagsulay aron masusi ang tanan nga mga detalye ug ipakita kung unsa ang mahimo sa mga server sa kini nga taripa. Aron mahimo kini nga labi ka makapaikag, gidugang namon ang grabe ug gisusi kung giunsa kini nga pag-configure kung ang densidad ug karga milapas sa mga kantidad nga among gitakda. 

Ang host ubos sa load sa usa ka gidaghanon sa mga virtual machines nga naghimo sa lain-laing mga buluhaton sa processor ug aktibo nga gigamit ang disk subsystem. Ang tumong mao ang pagsundog sa usa ka taas nga densidad sa pagbutang ug usa ka load nga ikatandi sa o mas dako pa kay sa usa ka panagsangka.

Dugang pa sa kanunay nga pagkarga, nag-instalar kami og 3 ka virtual machine nga nagkolekta og sintetikong metrics gamit ang sysbench, ang kasagarang resulta niini gihatag sa ubos, ug 50 ka virtual machine nga nakamugna og dugang nga load. Ang tanan nga mga pagsulay nga virtual machine adunay parehas nga pagsumpo (1 core, RAM 512 GB, SSD 10 GB), ang standard nga debian 9.6 nga imahe gipili ingon nga operating system, nga gitanyag sa mga tiggamit sa RUVDS.

Ang luwan gisundog sa kinaiyahan ug gidak-on nga ikatandi sa pakigbugno:

  • Ang pipila ka mga virtual nga makina gilunsad nga adunay gamay nga karga
  • Ang ubang mga makina nagpadagan og test script nga nagsundog sa load sa processor (gamit ang utility kapit-os)
  • Sa nahabilin nga bahin sa virtual nga mga makina, nagpadagan kami usa ka script nga gigamit ang dd aron kopyahon ang datos gikan sa giandam nang daan nga data sa disk nga adunay limitasyon nga gitakda gamit ang pv (makita ang mga pananglitan. dinhi ΠΈ dinhi).

Usab, sama sa imong nahinumduman, kami adunay tulo ka mga makina nga nagkolekta sa sintetikong sukatan.

Sa matag makina, usa ka script ang gipatuman cyclically matag 15 minuto, nga nagpadagan sa standard sysbench nga mga pagsulay alang sa processor, memorya ug disk.

Script 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

Ang mga resulta gipresentar alang sa kasayon ​​​​sa sysbench format, apan ang kasagaran nga mga bili alang sa tibuok nga panahon sa pagsulay gikuha gikan sa tanan nga mga makina, ang resulta makita dinhi:

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

Ang mga resulta nagpaila, apan sa gihapon dili angay isipon nga QoS. 

Mga makina nga naghimo og dugang nga load

Software:

  • Apt-get update
  • apt-get upgrade
  • apt-get install python-pip
  • pip i-install ang mysql-connector-python-rf

Gi-install ang MariaDB, Giunsa dinhi:

apt-get install libmariadbclient-dev
mysql -e "INSTALL PLUGIN blackhole SONAME 'ha_blackhole.so';" -- Π½ΡƒΠΆΠ½ΠΎ для test_employees_sha

Test base gikuha gikan dinhi:

Ang database gipakatap ingon nga gitakda dinhi:

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

Gamay nga test base:

Table 

RowsCount 

Gidak-on sa datos (MB)

Gidak-on sa indeks (KB)

mga departamento 

9

0.02

16.00

dept_emp 

331143 

11.52

5648.00

dept_manager 

24 

0.02

16.00

mga empleyado 

299379 

14.52

0.00

sweldo 

2838426 

95.63

0.00 

titulo 

442783 

19.56

0.00

Ang usa ka primitive nga serbisyo sa pagsulay gisulat sa tuhod sa Python; kini naghimo sa upat ka mga operasyon:

  1. getState: ibalik ang kahimtang
  2. getEmployee: nagbalik sa mga empleyado (+suweldo, +titulo) gikan sa database
  3. patchEmployee: nagbag-o sa mga natad sa empleyado
  4. insertSalary: nagsal-ot ug sweldo

Tinubdan sa serbisyo (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')

Pasidaan Sa bisan unsa nga kahimtang kinahanglan nga kini nga serbisyo mahimong usa ka panig-ingnan o giya!

Ang mga pagsulay gihimo gamit ang maayong daan nga JMeter. Usa ka serye sa mga pagsulay nga molungtad gikan sa 15 minuto hangtod 2 ka oras ang gilunsad, nga wala’y paghunong, ang porsyento sa mga hangyo lainlain, ug ang throughput naglainlain gikan sa 300 hangtod 600 nga mga hangyo matag minuto. Gidaghanon sa mga hilo gikan sa 50 hangtod 500.

Tungod sa kamatuoran nga ang database gamay ra kaayo, ang mando:

mysql -e "SHOW ENGINE INNODB STATUS"

Nagpakita nga:

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

Sa ubos mao ang kasagaran nga mga oras sa pagtubag alang sa mga hangyo:

label

Average

Median

90% Linya

95% Linya

99% Linya

Min

Max

getEmpleyado

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

patchEmpleyado

161.42

83.29

308

492.57

1845.14

5

6639.4

ibutangSweldo

167.21

86.93

315.34

501.07

1927.12

7

6722.44

Mahimong lisud alang kanimo ang paghukom gikan sa kini nga mga sintetikong resulta kung unsa ka angay kini nga VPS alang sa imong piho nga mga buluhaton ug, sa kinatibuk-an, ang nalista nga mga pamaagi limitado sa mga kaso nga kinahanglan namon atubangon sa usa ka porma o lain. klaro nga dili kompleto. Gidapit ka namo sa paghimo sa imong kaugalingon nga mga konklusyon ug pagsulay sa server alang sa 30 nga mga rubles sa imong tinuod nga mga aplikasyon ug mga buluhaton ug isugyot ang imong mga kapilian alang niini nga pagsumpo sa mga komentaryo.

Source: www.habr.com

Idugang sa usa ka comment