Heili + VPS fyrir 30 rúblur =?

Það er svo notalegt þegar allir nauðsynlegir litlu hlutir eru við höndina: góður penni og skrifblokk, skerptur blýantur, þægileg mús, nokkra aukavíra o.s.frv. Þessir lítt áberandi hlutir vekja ekki athygli heldur bæta huggun við lífið. Sömu sögu er að segja um ýmis farsíma- og skjáborðsforrit: fyrir langar skjámyndir, til að minnka stærð myndar, til að reikna út persónulegan fjárhag, orðabækur, þýðendur, breytir o.s.frv. Áttu einn? VPS - sem er ódýrt, alltaf við höndina og hefur marga kosti í för með sér? Nei, ekki það sem þú ert með í fyrirtækinu þínu, heldur þinn eigin „vasa“. Við héldum að án lítils VPS árið 2019 væri það einhvern veginn leiðinlegt, alveg eins og án venjulegs penna á fyrirlestri. Af hverju að vera dapur? Það er komið sumar. Hvernig er sumarið? Sumar fyrir upplýsingatæknisérfræðing: að sitja heima og vinna að uppáhaldsverkefnum þínum án nokkurrar eftirsjár. Almennt séð hugsuðum við og gerðum það.

Heili + VPS fyrir 30 rúblur =?
Kommúnisminn er kominn, félagar.

Hann er svona - VPS okkar fyrir þrjátíu

Við höfum lesið fullt af greinum frá samkeppnisaðilum og notendum sem skrifuðu fyrir 3-4 árum um hvers vegna ekki er þörf á ódýru VPS. Jæja, það er rétt, þá var VPS „fyrir eyri“ hrein markaðssetning og gat ekki boðið upp á eðlileg vinnutækifæri. En tímarnir eru að breytast, kostnaður við sýndarauðlindir er að verða lægri og lægri og fyrir 30 rúblur á mánuði erum við tilbúin að bjóða þetta:

  • Örgjörvi: Intel Xeon 2 GHz (1 kjarna)
  • Linux kerfi (Debian, Ubuntu, CentOS til að velja úr)
  • 1 sérstakt IPv4 vistfang
  • 10 GB af gagnageymslu á hröðum SSD-drifum í fyrirtækjaflokki
  • Vinnsluminni: 512 MB
  • Innheimta á sekúndu
  • Ótakmörkuð umferð

Gjaldskráin er háð frekari tæknilegum takmörkunum, upplýsingar um síðu flott tilboð okkar - VPS fyrir 30 rúblur. 

Hverjum hentar þessi sýndarþjónn? Já við næstum öllum: byrjendum, áhugamönnum, reyndum forriturum, DIY aðdáendum og jafnvel sumum fyrirtækjum.

Til hvers hentar þessi VPS?

Við teljum að lesendur Habr muni örugglega finna sína eigin leið til að nota þessa uppsetningu, en við ákváðum að safna okkar eigin úrvali af hugmyndum - hvað ef einhver þarf á því að halda en karlarnir vita það ekki?

  • Settu einfalda vefsíðu þína, eignasafn, ferilskrá með kóða osfrv. Auðvitað hefur þinn eigin hönnuðu vefsíða jákvæð áhrif á vinnuveitandann. Settu það á VPS þinn og berðu sjálfur ábyrgð á öryggi og stöðugleika síðunnar, en ekki af starfsfólki venjulegra hýsingaraðila.
  • Notaðu VPS í fræðslutilgangi: hýstu verkefnið þitt, kynntu þér eiginleika netþjónsins og stýrikerfisins á netþjóninum, gerðu tilraunir með DNS, tékkaðu á lítilli fræðslusíðu.
  • Fyrir símtöl. Stundum þarf einstaklingur frumkvöðull, sjálfstætt starfandi eða mjög lítið fyrirtæki sárlega á IP-símaþjónustu að halda og rekstraraðilar þessarar símaþjónustu eru mjög gráðugir. Það er einfalt: við tökum netþjóninn okkar, kaupum númer af IP-símafyrirtæki, setjum upp sýndarsímstöð og búum til innri númer (ef þarf). Sparnaðurinn er gríðarlegur.
  • Notaðu netþjóninn til að prófa forritin þín.
  • Notaðu netþjóninn fyrir DIY tilraunir, þar á meðal að stjórna og safna gögnum frá skynjara snjallheimakerfisins.
  • Óvenjuleg leið til að nota það er að setja sýndarviðskiptaaðstoðarmann, viðskiptavélmenni, á netþjóninn. Þú verður að fullu ábyrgur fyrir stöðugleika og öryggi netþjónsins, sem þýðir að þú færð stjórnað tæki til að eiga viðskipti á hlutabréfamörkuðum. Jæja, ef einhver hefur áhuga eða skipuleggur :)

Það eru til umsóknir um slíkt VPS á fyrirtækjasviðinu. Til viðbótar við áðurnefnda símaþjónustu geturðu útfært nokkra áhugaverða hluti. Til dæmis:

  • Settu litla gagnagrunna og upplýsingar sem verða aðgengilegar farandstarfsmönnum í fjarlægð, til dæmis með ftp. Þetta gerir þér kleift að skiptast mjög fljótt á ferskum greiningum, uppfærðum stillingum fyrir sölufólk, kynningar osfrv.
  • Veittu notendum eða viðskiptavinum tímabundinn aðgang til að sýna hugbúnað eða miðla.

VPS reynsluakstur fyrir 30 rúblur - gert fyrir þig

30 rúblur er svo lítið að þú vilt ekki einu sinni taka út kort til að borga og prófa. Við erum stundum svo löt líka, en í þetta skiptið gerðum við allt fyrir þig. Áður en netþjónarnir voru settir í bardaga gerðum við próf til að athuga allar upplýsingar og sýna hvað netþjónarnir geta á þessari gjaldskrá. Til að gera það áhugaverðara bættum við við öfgakenndum og athuguðum hvernig þessi uppsetning myndi haga sér ef þéttleiki og álag færi yfir gildin sem við settum. 

Gestgjafinn var undir álagi fjölda sýndarvéla sem sinntu ýmsum verkefnum á örgjörvanum og notuðu diska undirkerfið virkan. Markmiðið er að líkja eftir háum staðsetningarþéttleika og álagi sem er sambærilegt við eða meira en bardaga.

Til viðbótar við stöðugt álag settum við upp 3 sýndarvélar sem söfnuðu tilbúnum mælingum með því að nota sysbench, meðalniðurstöður þeirra voru gefnar upp hér að neðan, og 50 sýndarvélar sem bjuggu til viðbótarálag. Allar tilrauna sýndarvélar voru með sömu uppsetningu (1 kjarni, vinnsluminni 512 GB, SSD 10 GB), staðlað debian 9.6 myndin var valin sem stýrikerfi, sem er boðið notendum á RUVDS.

Álagið var hermt í eðli sínu og stærð sambærileg við bardaga:

  • Sumar sýndarvélar voru settar af stað með lítið álag
  • Sumar vélar keyrðu prufuforskrift sem líkti eftir álagi á örgjörva (með því að nota tólið streita)
  • Á hinum hluta sýndarvélanna keyrðum við skriftu sem notaði dd til að afrita gögn úr fyrirfram tilbúnum gögnum yfir á disk með takmörkunum sem sett eru með pv (dæmi má sjá hér и hér).

Eins og þú manst, vorum við með þrjár vélar sem söfnuðu tilbúnum mæligildum.

Á hverri vél var handrit keyrt á 15 mínútna fresti sem keyrir venjuleg sysbench próf fyrir örgjörva, minni og disk.

Handrit 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

Niðurstöðurnar eru settar fram til hægðarauka á sysbench sniði, en meðalgildi fyrir allt prófunartímabilið voru tekin úr öllum vélum, niðurstöðuna má sjá hér:

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

Niðurstöðurnar eru leiðbeinandi, en samt ætti ekki að taka þær sem QoS. 

Vélar sem búa til viðbótarálag

Hugbúnaður:

  • líklegur til-fá endurnýja
  • líklegur til að fá uppfærsla
  • apt-get setja upp python-pip
  • pip settu upp mysql-tengi-python-rf

Uppsett MariaDB, hvernig á að hér:

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

Prófgrunnur tekinn þess vegna:

Gagnagrunnurinn er notaður eins og tilgreint er hér:

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

Lítill prófunargrunnur:

Tafla 

RowsCount 

Gagnastærð (MB)

Stærð vísitölu (KB)

deildir 

9

0.02

16.00

dept_emp 

331143 

11.52

5648.00

deildarstjóri 

24 

0.02

16.00

starfsmenn 

299379 

14.52

0.00

laun 

2838426 

95.63

0.00 

titlar 

442783 

19.56

0.00

Frumstæð prófþjónusta er skrifuð á hnéð í Python; hún framkvæmir fjórar aðgerðir:

  1. getState: skilar stöðunni
  2. getEmployee: skilar starfsmönnum (+laun, +heiti) úr gagnagrunninum
  3. patchEmployee: breytir starfssviðum
  4. insertSalary: setur inn laun

Þjónustugjafi (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')

Attention! Þessa þjónustu ætti ekki undir neinum kringumstæðum að vera til fyrirmyndar eða leiðbeiningar!

Prófanir eru gerðar með því að nota gamla góða JMeter. Röð prófana sem stóðu í allt frá 15 mínútum til 2 klukkustunda voru settar af stað, án truflana, hlutfall beiðna var mismunandi og afköst var frá 300 til 600 beiðnum á mínútu. Fjöldi þráða frá 50 til 500.

Vegna þess að gagnagrunnurinn er mjög lítill mun skipunin:

mysql -e "SHOW ENGINE INNODB STATUS"

Sýnir að:

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

Hér að neðan eru meðalviðbragðstímar fyrir beiðnir:

Label

Meðal

Miðgildi

90% Lína

95% Lína

99% Lína

Min

max

fá starfsmann

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

plástur Starfsmaður

161.42

83.29

308

492.57

1845.14

5

6639.4

setja Laun

167.21

86.93

315.34

501.07

1927.12

7

6722.44

Það gæti verið erfitt fyrir þig að dæma út frá þessum tilbúnu niðurstöðum hversu hentugur þessi VPS hentar þínum sérstökum verkefnum og almennt eru upptaldar aðferðir takmarkaðar við þau mál sem við þurftum að takast á við í einu eða öðru formi. Þannig að listinn okkar er greinilega ekki tæmandi. Við bjóðum þér að draga þínar eigin ályktanir og prófa netþjóninn fyrir 30 rúblur á raunverulegum forritum þínum og verkefnum og stinga upp á valkostum þínum fyrir þessa stillingu í athugasemdunum.

Heimild: www.habr.com

Bæta við athugasemd