ααΆαα·αααΆααα’ααΆαα αα
ααααααααααα»ααΌα
αα
αΆαααΆα
αααΆααα’ααααΆααα
ααΉαααα ααα·α
αα·ααααααΆααααα
αααΆαααααα’ αααα
αααα»ααααα½α
ααααα»αααΆααααα½α ααααααααααααΈαααΈααα ααΏααα·αα
αααΆααααΆααααΆααααααα·αααΆααααΆαααΆαα
αΆααα’αΆαααααααα ααα»ααααααααααααΆααα½αααααααααΈαα·αα ααΏαααΌα
ααααΆααΊααΆαα½αααΉααααααα·ααΈααΌαααααα αα·ααα»αααααΌαααααααααααααΆα αααααΆααααΌαααα’ααααααααα αααααΆααααΆαααααααααα αααααΌαααΆα ααΆαααααΆα α·ααααααααα»ααααΆαααααα½α αα
ααΆαα»αααα α’ααααααααα α§ααααααααααααααα ααΎβα’αααβααΆαβαα½α?
αα»αααα»ααα·αααααΆααααααα αΎα αααα·αααα
ααΆααααΊαααααα - VPS ααααααΎααααααΆααααΆααα·α
ααΎαααΆαα’αΆαα’αααααααΆα αααΎαααΈααααΌααααα½ααααααα αα·αα’αααααααΎααααΆαααααααΆααααααααΆαααΈ 3-4 ααααΆααα»α α’αααΈααΌαα ααα»ααα VPS ααααα·αααααΌαααΆαα ααΆααΆααααααΎαααΆαα, αααααΆαααα VPS "αααααΆααααΆαααα½α" ααΊααΆααΈααααΆααα»ααα α αΎααα·αα’αΆα αααααα±ααΆαααΆαααΆαααααααΆααΆαααα ααα»αααααααααααΆαααα»αααααΆααααααΌα ααΆαα αααΆαααααααΆααα·αααα·αααΆααααααΆααα α α αΎααααααΆαα 30 ααΌαααα·αααα»ααα½ααα ααΎαααααααααααααΌααααα
- ααααΎαααΆαα Intel Xeon 2 GHz (1 ααααΌα)
- ααααααααααΈαα»α (Debian, Ubuntu, CentOS ααΎααααΈααααΎαααΎα)
- α’αΆααααααΆα IPv1 ααΆααααΆαα 4
- ααΆααααα»ααα·αααααα 10 GB αα ααΎααααΆα SSD ααααΆαααα ααααΆααααααΆαααααΏαααΏα
- RAMα α‘α’α¨ ααααΆαα
- αααα»ααα½ααα·ααααααααααΈααΈα
- α ααΆα αααααααΆααααααααα
ααααααααΊαααα·ααα
αααααααΆαααΉααααααΉααα
αα
ααααααααααα ααααααΆααααα’α·ααα
ααΎ
ααΎαααΆαααΈααααα·αααα·ααααααΆαααααΉαα’αααααΆ? ααΆααααααΆααααααΎααααααααααααΆα α’αααα αΆααααααΎαααααΌα α’αααα αΌαα α·ααα α’αααα’αα·αααααααααααΆααααα·ααααα α’αααααΆαααα DIY αα·αααΌααααΈαααααα»αα αα»ααα½αα ααα½αα
ααΎ VPS αααααΆαααααΉαα’αααΈ?
ααΎααα·αααΆα’αααα’αΆααααα Habr ααααΆααααΆααΉαααααΎααα·ααΈααααΆαααααα½ααααααα½ααααααα»αααΆαααααΎααααΆααααΆαααααααα ααΆααααααααααα ααα»ααααααΎαααΆααααααα α α·ααααααααΌαααΌααααααΎαααααΆαααααα½αααααααΎα - α α»αααααα·αααΎααααΆααααΆααααααΌαααΆαααΆ ααα»αααααα»αααα·αααΉα?
- ααΆααααα αααααααΆααααααααα’ααα ααααααα αααααααα·ααΌαααααααααΆαα½ααααααΌαααα ααΆβααΆαβαα·αβααΆαα ααα αααααβαααβααΆαβαα ααΆβαααβαααα½αβα―αβααααΎβα±ααβααΆαβα αααΆααβα’αΆααααααβααΆβαα·αααααΆαβααΎβαα·ααααα ααΆααααΆαα ααΎ VPS ααααα’ααα α αΎαααα½ααα»αααααΌαα αααααα»ααααα·ααΆα αα·ααααααααΆαααααα αααααααααααα½αα―α α αΎααα·ααααααααα»ααααα·αααα’ααααααααααααΆαααα ααααααααΆαααααα
- ααααΎ VPS αααααΆαααααααααα’ααααα ααααΎααΆααα αΆααααααααααααααααα’ααα αα·ααααΆααΈαααααααα·ααααααααααΆαααΈααα αα·αααααααααααααα·ααααα·ααΆααααΆαααΈααα αα·αααααααΆαα½α DNS αα·α tinker ααΆαα½αααα αααααα’ααααααΌα αα½αα
- αααααΆααααΌααααααα ααααααα αα αααα·ααα»αααα α’αααα―αααΆααα α¬αααα»αα αα»αααΌα αα½αααααΌαααΆαααΌαααααα IP αααΆαααααΆαα α αΎαααααα·ααααα·ααααααΌαααααααααααΆαααΆαααααααααααΆααα ααΆααΆααααα ααΎααααααΆαααΈαααααααααΎα αα·ααααααΈααααα·ααααα·ααααΌαααααα IP αααααΎα PBX αα·αααα·α αα·ααααααΎααααααΆααααα»α (ααΎα αΆαααΆα α)α ααΆααααααααΆαα αααΎαααΆααα
- ααααΎαααΆαααΈαααααΎααααΈααΆααααααααααα·ααΈααααα’αααα
- ααααΎαααΆαααΈααααααααΆααααΆααα·ααααα DIY αα½αααΆααααΆαααααααααα αα·ααααααΌααα·ααααααααΈα§αααααα αΆαααααααΆααααααααααααααααΆαααα
- αα·ααΈαα·αααααααΆαα½ααααα»αααΆαααααΎααΆααΊααΆαααααα½αααΆααα½αααΌααα·αααα·α ααΌαααααααΆαα·ααααααααα ααΎαααΆαααΈαααα α’αααααΉαααα½ααα»αααααΌαααΆαααααα»αα αααααααααααΆα αα·ααα»ααααα·ααΆααααααααΆαααΈααα αααααΆααααααΆα’αααααΉαααα½αααΆαα§αααααααααααααααααααΆααααΆααα½αααΌααα ααΎααΈααααΆαααΆαα αα»αα ααΆααΆααααααΎαααΆαα, αααα»αααααΈααΆαααααΆααααΆααα αΆααα’αΆααααααα¬αααα ααααααΆα :)
ααΆααααααα·ααΈαααααΆαα VPS αααααααα αααα»ααα·αααααΆααΈαααααα ααααααααΈααΎααααΆααΌαααααααααααΆααααααΆαααα½α α αΎα α’αααα’αΆα α’αα»ααααα’αααΈααααα½αα±ααα αΆααα’αΆααααααααΆα αααΎαα α§ααΆα ααα:
- ααΆααααΌαααααΆααα·ααααααααΌα α αα·αααααααΆααααααΉαα’αΆα α αΌαααααΎαααΆαααΆααααααΆαααα»ααααα·αααααΎααααΎαααΈα ααααΆα α§ααΆα ααα αααααααΎ ftp α ααΆβααΉαβα’αα»ααααΆαβα±ααβα’αααβααααΆααααααΌαβααΆααα·ααΆαβααααΈα ααΆααααααβαα ααΆααααααααβααααΈαβαααΆαβααΆαααα ααβαααααΆααβα’αααβααα ααβαααα αΆαβααΆααΎαα
- ααααααα·αααα·ααααΎααααΆααααααααα’αΆαααααααα’αααααααΎααααΆαα α¬α’αα·αα·αα ααΎααααΈαααα αΆααααααα·ααΈ α¬ααααααααααααααααααΆαα
ααΆαααααΎααααα VPS αααααΆαα 30 ααΌαααα·α - αα½α ααΆαααααααΆααα’ααα
30 rubles ααΊαα·α αα½α ααΆαααααα’ααααα·αα ααααααΆαααΎααααΈαααααααΆαααα·αααΆαααααα ααααααααα½αααΎααααααα·αααα ααα»ααααααΎαααααα½αααΎαααααΎααααααααΆαααΎααααΈα’αααα αα»ααααααΎαααααΎαααΆααααΆαααΈαααα αΌααα αααα»ααααααΌαα· ααΎαααΆαααααΎααΆαααΆααααααα½αααΎααααΈαα·αα·αααααΎαααααααΆααααα’α·αααΆααα’αα αα·ααααα αΆαααΈα’αααΈααααααΆαααΈαααααΆααααααααΆααααα»αα’ααααΆαααααααα ααΎααααΈααααΎα±ααααΆααΆαααααα½αα±ααα αΆααα’αΆαααααα ααΎαααΆαααααααααΆαααααΆαα αα·ααα·αα·αααααΎαααΆααΎααΆαααααααα ααΆαααααααααααααΉααααααααΉααααα αααΆαααΌα ααααα ααααα·αααΎααααααΈαα αα·αααααα»αααΎαααΈααααααααααΎααααααα
αααΆαααΈαααΊαααα·ααα αααααααααα»ααααααΆαααΈααα·αααα·ααα½αα ααα½αααααααααααΆαααΆααααααααα ααΎαα½αααααΆα α αΎαααααΎααααΆααααααααααααααααααΈααααΆααααααα ααααα ααΊααΎααααΈαααααααααΎααααααΈαααααααααααΆαααΆαα αα·αααααα»ααααα’αΆα αααααααααα ααΉα α¬ααααΆαααΆαααααα»ααααα½αα
ααααααααΈααΎααααα»αααα ααΎαααΆαααα‘αΎααααΆαααΈααα·αααα·αα ααα½α 3 ααααααααΌαααααααααααααααααααΎ sysbench αααααααααααΆαααααααααΌαααΆααααααα±ααααΆαααααα αα·ααααΆαααΈααα·αααα·αα ααα½α 50 ααααααααΎαααααα»αααααααα αααΆαααΈααα·αααα·αααΆαααααααΆααα’ααααΆαααΆαααααααα ααΆααααααααααΌα ααααΆ (1 ααααΌα RAM 512 GB, SSD 10 GB) ααΌαααΆααααααααΆα debian 9.6 ααααΌαααΆαααααΎαααΎαααΆααααααααααααα·ααααα·ααΆα αααααααΌαααΆααααααααΌαα’αααααααΎααααΆαααα ααΎ RUVDS α
ααααα»αβααααΌαβααΆαβαααααβααααΎβααΆαβααααααβααααααΆαα· αα·αβααα αβαααβααΉαβααΆαβααααα»αααα
- αααΆαααΈααα·αααα·ααα½αα ααα½αααααΌαααΆαααΆααα±ααααααΎαααΆαααΆαα½αααΉαααΆααααα»αααΆα
- αααΆαααΈααα½αα
ααα½αααΆαααααΎαααΆαααααααΈαααΆαααααααααααααααααΎααααα»ααα
ααΎαα½αααααΆα (αααααααΎα§αααααααααΎααααΆαα
ααΆαααΆαααΉα ) - αα
ααΎαααααααααα
ααααααααΆαααΈααα·αααα·α ααΎαααΆαααααΎαααΆαααααααΈααααααααΎ dd ααΎααααΈα
αααααα·ααααααααΈαα·αααααααααααΆααααα
αααΆαα»ααα
ααΈαααΆαα½αααΉααααααααααααααΆαααααααααααααΎ pv (α§ααΆα αααα’αΆα
ααΎαααΎα
αα ααΈααα ΠΈαα ααΈααα ).
ααΌα αααα’αααα αα αΆαααααα ααΎαααΆααααΆαααΈαα ααα½α XNUMX ααααααααΌααααααααααααα
αα ααΎαααΆαααΈαααΈαα½αα ααααααΈααα½αααααΌαααΆαααααα·ααααα·ααΆαααααααααααΆαα 15 ααΆααΈαααα αααααααΎαααΆαααΆαααααΎααααα sysbench αααααααΆααααααΆαααα½αααααΆα α’αααα αα αΆα αα·αααΆαα
ααααααΈα 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
ααααααααααΌαααΆααααα αΆααααααΆααααΆαααΆααααα½ααααα»ααααααα sysbench ααα»αααααααααααΆααααααααααΆααααααααααΆαααααααΆααααΌαααααΌαααΆαααααα ααααΈαααΆαααΈαααΆααα’αα ααααααα’αΆα ααΎαααΎααα ααΈαααα
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
ααααααααΊα
ααα’α»ααααα αΆα ααα»αααααα
αααα·ααα½αααααΆ QoS ααα
αααΆαααΈαααααααααΎαααααα»ααααααα
αααααααα:
- apt-get update
- apt-get upgrade
- apt-get ααα‘αΎααααααααΆαα -p
- pip ααα‘αΎα mysql-connector-python-rf
ααΆαααα‘αΎα MariaDB, αααα
apt-get install libmariadbclient-dev
mysql -e "INSTALL PLUGIN blackhole SONAME 'ha_blackhole.so';" -- Π½ΡΠΆΠ½ΠΎ Π΄Π»Ρ test_employees_sha
ααΌαααααΆαααΆαααααααααΌαααΆααα
ααΌαααααΆααα·ααααααααααΌαααΆαααΆααα±ααααααΎααααΆααααΌα
αααααΆααααααΆαα
mysql -t < employees.sql
mysql -t < test_employees_sha.sql
ααΌαααααΆαααΆαααααααΌα α
ααΆααΆα
α ααα½ααα½αααα
ααα ααα·αααααα (MB)
ααα αααααααααα (KB)
ααΆααααααΆα
9
0.02
16.00
dept_emp
331143
11.52
5648.00
dept_manager
24
0.02
16.00
αα»ααααα·α
299379
14.52
0.00
ααααΆαααα
2838426
95.63
0.00
α αααααΎα
442783
19.56
0.00
ααααΆααααααΆαααααααααΌαααααΌαααΆαααααααα ααΎαααααααα αααα»α Python ααΆααααΎαααΆααα½ααααΆαα
- getStateα αααα‘ααααααΆαααΆα
- getEmployeeα αααα‘αααα»ααααα·α (+ααααΆαααα+α αααααΎα) ααΈααΌαααααΆααα·αααααα
- patchEmployee: ααααΆααααααΌαααΆααα»ααααα·α
- insertSalary: αααα αΌαααααΆαααα
αααααααααΆαααα (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')
ααΌααααααααα! αα·ααααα·ααααααααΆααααααααΆααααααα·ααα½αααααααΆαααααααααααΎααΆα§ααΆα ααα α¬ααΆαααααΆαα‘αΎα!
ααΆαααααΎαααααααααΌαααΆαα’αα»αααααααααααΎ JMeter α αΆααααα’α αααααΈααααΆαααααΎααααααααααΆαααααααααΈ 15 ααΆααΈαα 2 ααααααααΌαααΆαα αΆααααααΎα αααααααΆαααΆαααααΆα ααΆαααααααααΎαααααααα½α α αΎααααααααααααααα½αααΈ 300 αα 600 ααααΎαααα»ααα½αααΆααΈα α ααα½ααααααααα‘αΆαααΈ 50 αα 500 α
αααααΆαααααΆααα·ααααααΆααΌαααααΆααα·ααααααααΌα ααΆααααΆααααααααΆ:
mysql -e "SHOW ENGINE INNODB STATUS"
αααα αΆαααΆα
Buffer pool hit rate 923 / 1000, young-making rate 29 / 1000 not 32 / 1000
ααΆααααααααΊααΆαααααααΆααααΎαααααΆααααααααααΆααααααΎα
ααααΆα
ααΆβααααα
ααααα
90% αααααΆαα
95% αααααΆαα
99% αααααΆαα
ααΆααΈ
α’αα·ααααΆ
ααα½ααα»ααααα·α
37.64
12.57
62.28
128.5
497.57
5
4151.78
ααα½αααΆααααα
17
7.57
30.14
58.71
193
3
2814.71
patch αα»ααααα·α
161.42
83.29
308
492.57
1845.14
5
6639.4
ααΆααααααΆαααα
167.21
86.93
315.34
501.07
1927.12
7
6722.44
ααΆα’αΆα
ααΆααΆαααααΆααααααΆααα’ααααααα»αααΆααα·αα·α
ααααααΈαααααααααααααΆαααααααΆααΎ VPS αααααααααααα»ααααΆαααααΆαααα·α
αα
ααΆαααΆααααΆααααααα’ααα α αΎαααΆααΌαα
αα·ααΈααΆααααααααααΆαααΆααααααΈααααΌαααΆααααααα
ααααααααΈααΆααααααααααΎαααααΌααααααααΆααααα»ααααααααα½α α¬ααααααααααααααα ααΌα
αααααααααΈααααααΎαααΊ α
αααΆααααΆαααα·αααααααα ααΎαααΌαα’ααααΎαα’αααα±ααααααΎααΆαααααα·ααααΆαααααααα½αα―α α αΎαααΆααααααααΆαααΈααααααα»αααααα 30 ααΌαααα·αα
ααΎαααααα·ααΈ αα·αααΆααα·α
αα
αα·αααααα’ααα α αΎαααααΆααααααΎαααααα’ααααααααΆααααΆαααααααα
ααΆααααααααααααα
αααα»αααα·αααααα
ααααα: www.habr.com