Brain + VPS na 30 rubles =?

Yana da kyau sosai lokacin da duk ƙananan abubuwan da ake buƙata suna kusa: alkalami mai kyau da faifan rubutu, fensir mai kaifi, linzamin kwamfuta mai dadi, wasu ƙarin wayoyi, da sauransu. Wadannan abubuwan da ba a san su ba ba sa jawo hankali, amma suna kara jin dadi ga rayuwa. Haka labarin yake tare da aikace-aikacen wayar hannu da tebur daban-daban: don dogon hotuna, don rage girman hoto, don ƙididdige kuɗaɗen sirri, ƙamus, masu fassara, masu canzawa, da sauransu. Kuna da daya? VPS - wanda ba shi da tsada, koyaushe yana hannun kuma yana kawo fa'idodi da yawa? A'a, ba wanda kuke da shi a cikin kamfanin ku ba, amma naku, "aljihu" ɗaya. Mun yi tunanin cewa ba tare da ƙaramin VPS ba a cikin 2019 abin baƙin ciki ne ko ta yaya, kamar ba tare da alkalami na marmaro na yau da kullun ba a lacca. Me yasa za ku yi baƙin ciki? Lokacin bazara ne. Yaya lokacin rani? Lokacin bazara don ƙwararren IT: zaune a gida, yin aiki akan ayyukan da kuka fi so ba tare da wani nadama ba. Gabaɗaya, mun yi tunani kuma mun aikata shi.

Brain + VPS na 30 rubles =?
Kwaminisanci ya iso 'yan'uwa.

Ya kasance kamar haka - VPS ɗinmu na talatin

Mun karanta labarai da yawa daga masu fafatawa da masu amfani waɗanda suka rubuta shekaru 3-4 da suka gabata game da dalilin da yasa ba a buƙatar VPS mara tsada. To, haka ne, to, VPS "na dinari" ya kasance tallace-tallace mai tsabta kuma ba zai iya ba da damar aiki na yau da kullum ba. Amma lokuta suna canzawa, farashin albarkatun kayan aiki yana zama ƙasa da ƙasa, kuma don 30 rubles a wata muna shirye don bayar da wannan:

  • Mai sarrafawa: Intel Xeon 2 GHz (1 core)
  • Tsarin Linux (Debian, Ubuntu, CentOS don zaɓar daga)
  • 1 adireshin IPv4 na musamman
  • 10 GB na ajiyar bayanai akan faifan SSD-aji mai sauri na kasuwanci
  • RAM: 512 MB
  • Biyan kuɗi na biyu
  • Unlimited zirga-zirga

Farashin kuɗin fito yana ƙarƙashin ƙarin hani na fasaha, cikakkun bayanai akan page tayin mu mai kyau - VPS don 30 rubles. 

Wanene wannan rumbun sabar da ta dace da ita? Ee ga kusan kowa da kowa: masu farawa, masu goyon baya, ƙwararrun masu haɓakawa, masu sha'awar DIY har ma da wasu kamfanoni.

Menene wannan VPS ya dace da shi?

Muna tsammanin cewa masu karatun Habr tabbas za su sami nasu hanyar yin amfani da wannan tsari, amma mun yanke shawarar tattara namu zaɓi na ra'ayoyin - menene idan wani yana buƙata, amma mazan ba su sani ba?

  • Sanya gidan yanar gizon ku mai sauƙi, fayil ɗin fayil, ci gaba tare da lamba, da sauransu. Tabbas, gidan yanar gizon ku da aka tsara yana da tasiri mai kyau akan mai aiki. Sanya shi akan VPS ɗin ku kuma ku kasance masu alhakin tsaro da kwanciyar hankali na rukunin yanar gizon da kanku, kuma ba ta hanyar ma'aikatan masu ba da sabis na yau da kullun ba.
  • Yi amfani da VPS don dalilai na ilimi: karbi bakuncin aikinku, nazarin fasalulluka na uwar garken da tsarin aiki na uwar garken, gwaji tare da DNS, tinker tare da ƙaramin rukunin ilimi.
  • Don wayar tarho. Wani lokaci mutum dan kasuwa, mai zaman kansa ko kuma karamin kamfani yana matukar bukatar wayar IP, kuma masu gudanar da wannan wayar suna da kwadayin gaske. Abu ne mai sauƙi: muna ɗaukar sabar mu, siyan lamba daga afaretan wayar IP, saita PBX mai kama da ƙirƙira lambobi na ciki (idan ya cancanta). Adadin yana da yawa.
  • Yi amfani da uwar garken don gwada aikace-aikacenku.
  • Yi amfani da sabar don gwaje-gwajen DIY, gami da sarrafawa da tattara bayanai daga firikwensin tsarin gida mai kaifin baki.
  • Wata sabuwar hanyar amfani da ita ita ce sanya mataimakiyar ciniki ta musanya, mutum-mutumin ciniki, akan sabar. Za ku kasance da cikakken alhakin kwanciyar hankali da tsaro na uwar garken, wanda ke nufin za ku karbi kayan aiki mai sarrafawa don ciniki a kan kasuwannin hannun jari. To, idan wani yana da sha'awa ko shirin :)

Akwai aikace-aikace don irin wannan VPS a cikin tsarin kamfani. Baya ga sabis ɗin tarho da aka ambata, zaku iya aiwatar da abubuwa masu ban sha'awa da yawa. Misali:

  • Sanya ƙananan bayanan bayanai da bayanan da za su sami dama ga ma'aikatan tafiya a nesa, misali, ta amfani da ftp. Wannan zai ba ku damar musanya sabbin ƙididdiga cikin sauri, sabunta saitunan masu siyarwa, gabatarwa, da sauransu.
  • Ba da damar ɗan lokaci ga masu amfani ko abokan ciniki don nuna software ko kafofin watsa labarai.

Gwajin gwajin VPS na 30 rubles - an yi muku

30 rubles kaɗan ne wanda ba kwa son ɗaukar katin don biya da gwadawa. Mu wani lokacin ma kasalaci ne, amma wannan lokacin mun yi muku komai. Kafin ƙaddamar da sabobin cikin yaƙi, mun gudanar da gwaji don bincika duk cikakkun bayanai kuma mu nuna abin da sabobin ke iya a wannan jadawalin kuɗin fito. Don yin shi mafi ban sha'awa, mun ƙara matsananci kuma mun duba yadda wannan tsarin zai kasance idan yawa da kaya sun wuce ƙimar da muka saita. 

Mai watsa shiri yana ƙarƙashin nauyin injuna masu kama-da-wane da yawa waɗanda suka yi ayyuka daban-daban akan na'urar kuma suna amfani da tsarin faifai. Manufar ita ce a kwaikwayi babban adadin jeri da kaya mai kama da ko mafi girma fiye da na fama.

Bugu da ƙari, nauyin kullun, mun shigar da na'urori masu mahimmanci guda 3 waɗanda suka tattara ma'auni na synthetic ta amfani da sysbench, matsakaicin sakamakon da aka ba da shi a ƙasa, da kuma na'urori 50 masu mahimmanci waɗanda suka haifar da ƙarin kaya. Duk injunan gwaji suna da tsari iri ɗaya (1 core, RAM 512 GB, SSD 10 GB), an zaɓi madaidaicin hoton debian 9.6 azaman tsarin aiki, wanda aka ba wa masu amfani akan RUVDS.

An kwaikwayi nauyin a cikin yanayi da girma mai kama da yaƙi:

  • An ƙaddamar da wasu injunan kama-da-wane da ƙananan kaya
  • Wasu injina sun gudanar da rubutun gwajin da ke kwaikwaya lodi akan na'ura mai sarrafawa (ta amfani da mai amfani danniya)
  • A kan sauran na'urori masu kama-da-wane, mun gudanar da rubutun da ke amfani da dd don kwafin bayanai daga bayanan da aka riga aka shirya zuwa faifai tare da iyakataccen saiti ta amfani da pv (misalan za a iya gani). a nan и a nan).

Har ila yau, kamar yadda kuka tuna, muna da inji guda uku waɗanda suka tattara ma'auni na roba.

A kan kowace na'ura, an aiwatar da rubutun a cyclyly kowane minti 15, wanda ke gudanar da daidaitattun gwaje-gwajen sysbench don processor, ƙwaƙwalwar ajiya da faifai.

Rubutun 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

Ana gabatar da sakamakon don dacewa a cikin tsarin sysbench, amma matsakaicin ƙimar duk lokacin gwaji an ɗauke shi daga duk injina, ana iya ganin sakamakon anan:

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

Sakamakon yana nuni ne, amma har yanzu bai kamata a ɗauke shi azaman QoS ba. 

Injin da ke haifar da ƙarin kaya

Software:

  • dace-samun update
  • dace-samun inganci
  • a-samu kafa Python-pip
  • pip shigar mysql-connector-python-rf

An shigar da MariaDB, Yadda ake a nan:

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

Tushen gwajin da aka ɗauka daga nan:

Ana tura bayanan bayanai kamar yadda aka ƙayyade a nan:

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

Ƙananan ginin gwaji:

Table 

Lissafin Lissafi 

Girman bayanai (MB)

Girman Fihirisa (KB)

sassan 

9

0.02

16.00

dept_emp 

331143 

11.52

5648.00

dept_manager 

24 

0.02

16.00

ma'aikata 

299379 

14.52

0.00

albashi 

2838426 

95.63

0.00 

sunayen sarauta 

442783 

19.56

0.00

An rubuta sabis ɗin gwaji na farko akan gwiwa a Python; yana yin ayyuka huɗu:

  1. getState: yana dawo da matsayi
  2. getEmployee: mayar da ma'aikata (+ albashi, + lakabi) daga ma'ajin bayanai
  3. ma'aikaci: canza filayen ma'aikata
  4. saka Salary: saka albashi

Tushen sabis (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')

Tsanaki Babu wani yanayi da ya kamata a ɗauki wannan sabis ɗin a matsayin misali ko jagora!

Ana yin gwaje-gwaje ta amfani da tsohuwar JMeter mai kyau. An ƙaddamar da jerin gwaje-gwajen da za a yi daga mintuna 15 zuwa sa'o'i 2, ba tare da katsewa ba, adadin buƙatun ya bambanta, kuma abin da ake samarwa ya bambanta daga buƙatun 300 zuwa 600 a cikin minti ɗaya. Yawan zaren daga 50 zuwa 500.

Saboda gaskiyar cewa ma'ajin bayanan yana da kankanta, umarni:

mysql -e "SHOW ENGINE INNODB STATUS"

Ya nuna cewa:

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

A ƙasa akwai matsakaicin lokacin amsa buƙatun:

Lakabin

Talakawan

Median

Layi 90%.

Layi 95%.

Layi 99%.

min

Max

samun Ma'aikaci

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

ma'aikacin faci

161.42

83.29

308

492.57

1845.14

5

6639.4

sa Albashi

167.21

86.93

315.34

501.07

1927.12

7

6722.44

Yana iya zama da wahala a gare ku ku yanke hukunci daga waɗannan sakamakon haɗin gwiwa yadda ya dace da wannan VPS don takamaiman ayyukanku kuma, gabaɗaya, hanyoyin da aka lissafa suna iyakance ga waɗannan lamuran waɗanda dole ne mu magance su a cikin nau'i ɗaya ko wata. Don haka jerinmu shine. a fili ba gamawa ba. Muna gayyatar ku don zana ra'ayoyin ku kuma gwada sabar don 30 rubles akan ainihin aikace-aikacenku da ayyukanku kuma ku ba da shawarar zaɓuɓɓukanku don wannan saitin a cikin sharhi.

source: www.habr.com

Add a comment