Gerekli tüm küçük şeylerin elinizin altında olması çok güzel: iyi bir kalem ve not defteri, sivri uçlu bir kalem, rahat bir fare, birkaç ekstra kablo vb. Bu göze çarpmayan şeyler dikkat çekmez, aksine hayata rahatlık katar. Aynı hikaye çeşitli mobil ve masaüstü uygulamalar için de geçerlidir: uzun ekran görüntüleri için, resmin boyutunu küçültmek için, kişisel finans hesaplamaları için, sözlükler, çevirmenler, dönüştürücüler vb. Sen de var mı? VPS - Hangisi ucuz, her zaman elinizin altında ve birçok fayda sağlıyor? Hayır, şirketinizde olan değil, kendi "cepinizdeki" olan. 2019'da küçük bir VPS'nin olmamasının, tıpkı derslerde her zamanki dolma kalem olmaması gibi, bunun bir şekilde üzücü olduğunu düşündük. Neden üzgünsün? Yaz. Yaz nasıl? Bir BT uzmanı için yaz: evde oturmak, en sevdiğiniz projeler üzerinde pişmanlık duymadan çalışmak. Genel olarak düşündük ve yaptık.
Komünizm geldi yoldaşlar.
O böyle - otuz kişilik VPS'miz
Ucuz bir VPS'ye neden ihtiyaç duyulmadığına dair 3-4 yıl önce yazan rakiplerden ve kullanıcılardan birçok makale okuduk. Doğru, o zaman "bir kuruş karşılığında" VPS saf pazarlamaydı ve normal çalışma fırsatları sunamazdı. Ancak zaman değişiyor, sanal kaynakların maliyeti giderek düşüyor ve ayda 30 ruble karşılığında şunu sunmaya hazırız:
İşlemci: Intel Xeon 2 GHz (1 çekirdek)
Linux sistemi (Debian, Ubuntu, CentOS arasından seçim yapılabilir)
1 özel IPv4 adresi
Hızlı kurumsal sınıf SSD sürücülerde 10 GB veri depolama
Bellek: 512 MB
Saniye başına faturalandırma
sınırsız trafik
Tarife ek teknik kısıtlamalara tabidir, ayrıntılar sayfa harika teklifimiz - 30 ruble için VPS.
Bu sanal sunucu kimler için uygundur? Hemen hemen herkese evet: yeni başlayanlar, meraklılar, deneyimli geliştiriciler, Kendin Yap hayranları ve hatta bazı şirketler.
Bu VPS ne için uygundur?
Habr okuyucularının kesinlikle bu konfigürasyonu kullanmanın kendi yolunu bulacağını düşünüyoruz, ancak kendi fikirlerimizi toplamaya karar verdik - ya birisinin buna ihtiyacı varsa ama erkekler bilmiyorsa?
Basit web sitenizi, portföyünüzü, kodlu özgeçmişinizi vb. yerleştirin. Elbette kendi tasarladığınız web siteniz işveren üzerinde olumlu bir izlenim bırakıyor. Bunu VPS'nize yerleştirin ve sitenin güvenliğinden ve istikrarından siz sorumlu olun, sıradan barındırma sağlayıcılarının personeli tarafından değil.
VPS'yi eğitim amaçlı kullanın: projenizi barındırın, sunucunun ve sunucu işletim sisteminin özelliklerini inceleyin, DNS ile denemeler yapın, küçük bir eğitim sitesiyle uğraşın.
Telefon için. Bazen bireysel bir girişimci, serbest çalışan veya çok küçük bir şirket, IP telefonuna umutsuzca ihtiyaç duyar ve bu telefonun operatörleri çok açgözlüdür. Çok basit: Sunucumuzu alıyoruz, bir IP telefon operatöründen bir numara alıyoruz, sanal bir PBX kuruyoruz ve dahili numaralar oluşturuyoruz (gerekirse). Tasarruflar muazzam.
Uygulamalarınızı test etmek için sunucuyu kullanın.
Akıllı ev sistemi sensörlerinden verilerin kontrol edilmesi ve toplanması da dahil olmak üzere, DIY deneyleri için sunucuyu kullanın.
Bunu kullanmanın alışılmadık bir yolu, sunucuya sanal bir takas ticaret asistanı, bir ticaret robotu yerleştirmektir. Sunucunun istikrarı ve güvenliğinden tamamen siz sorumlu olacaksınız; bu, borsalarda işlem yapmak için kontrollü bir araç alacağınız anlamına gelir. Peki, ilgilenen veya planlayan varsa :)
Kurumsal alanda bu tür VPS için uygulamalar var. Daha önce bahsedilen telefon hizmetine ek olarak, birçok ilginç şeyi de uygulayabilirsiniz. Örneğin:
Seyahat eden çalışanların erişebileceği küçük veritabanlarını ve bilgileri, örneğin ftp kullanarak uzak bir yere yerleştirin. Bu, yeni analizleri, satış elemanları için güncellenmiş yapılandırmaları, sunumları vb. çok hızlı bir şekilde paylaşmanıza olanak tanır.
Yazılım veya medyayı göstermek için kullanıcılara veya istemcilere geçici erişim verin.
30 ruble karşılığında VPS test sürüşü - sizin için yapıldı
30 ruble o kadar az ki, ödeme yapmak ve test etmek için kart çıkarmak bile istemiyorsunuz. Bazen biz de çok tembeliz ama bu sefer her şeyi sizin için yaptık. Sunucuları savaşa başlatmadan önce tüm ayrıntıları kontrol etmek ve sunucuların bu tarifede neler yapabileceğini göstermek için bir test yaptık. Daha ilginç hale getirmek için ekstrem ekledik ve yoğunluğun ve yükün belirlediğimiz değerleri aşması durumunda bu konfigürasyonun nasıl davranacağını kontrol ettik.
Ana bilgisayar, işlemci üzerinde çeşitli görevleri gerçekleştiren ve disk alt sistemini aktif olarak kullanan bir dizi sanal makinenin yükü altındaydı. Amaç, yüksek yerleştirme yoğunluğunu ve savaş yüküne benzer veya bundan daha büyük bir yükü simüle etmektir.
Sabit yükün yanı sıra ortalama sonuçları aşağıda verilen sysbench kullanarak sentetik metrikler toplayan 3 adet sanal makine ve ek yük oluşturan 50 adet sanal makine kurulumu gerçekleştirdik. Test sanal makinelerinin tümü aynı konfigürasyona sahipti (1 çekirdek, RAM 512 GB, SSD 10 GB), işletim sistemi olarak RUVDS üzerinde kullanıcılara sunulan standart debian 9.6 görüntüsü seçildi.
Yük, doğası gereği ve savaşla karşılaştırılabilir büyüklükte simüle edildi:
Bazı sanal makineler düşük yükle başlatıldı
Bazı makineler işlemci üzerindeki yükü simüle eden bir test komut dosyası çalıştırdı (yardımcı programı kullanarak) stres)
Sanal makinelerin geri kalan kısmında önceden hazırlanmış verilerden pv kullanarak bir limit seti ile verileri diske kopyalamak için dd kullanan bir script çalıştırdık (örnekler görülebilir) burada и burada).
Ayrıca hatırlayacağınız gibi sentetik metrikleri toplayan üç makinemiz vardı.
Her makinede, işlemci, bellek ve disk için standart sysbench testlerini çalıştıran bir komut dosyası her 15 dakikada bir döngüsel olarak yürütülüyordu.
Komut dosyası 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
Sonuçlar kolaylık sağlamak için sysbench formatında sunulmuştur, ancak tüm test döneminin ortalama değerleri tüm makinelerden alınmıştır, sonuç burada görülebilir:
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
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
Sonuçlar gösterge niteliğindedir ancak yine de QoS olarak alınmamalıdır.
#!/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')
Uyarı! Bu hizmet hiçbir durumda örnek veya rehber olarak alınmamalıdır!
Testler eski güzel JMeter kullanılarak gerçekleştirilir. 15 dakikadan 2 saate kadar süren bir dizi test kesintisiz olarak başlatıldı, taleplerin yüzdesi değişti ve verim dakikada 300 ila 600 talep arasında değişti. 50'den 500'e kadar iş parçacığı sayısı.
Veritabanının çok küçük olması nedeniyle komut:
mysql -e "SHOW ENGINE INNODB STATUS"
Gösterir ki:
Buffer pool hit rate 923 / 1000, young-making rate 29 / 1000 not 32 / 1000
Aşağıda istekler için ortalama yanıt süreleri verilmiştir:
etiket
Ortalama
Medyan
%90 Hat
%95 Hat
%99 Hat
min
maksimum
çalışan al
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
yamaÇalışan
161.42
83.29
308
492.57
1845.14
5
6639.4
koymakMaaş
167.21
86.93
315.34
501.07
1927.12
7
6722.44
Bu sentetik sonuçlardan bu VPS'nin spesifik görevleriniz için ne kadar uygun olduğuna karar vermek sizin için zor olabilir ve genel olarak listelenen yöntemler, şu veya bu şekilde ele almak zorunda kaldığımız durumlarla sınırlıdır. açıkça kapsamlı değildir. Sizi kendi sonuçlarınızı çıkarmaya ve sunucuyu gerçek uygulamalarınız ve görevleriniz üzerinde 30 ruble için test etmeye ve yorumlarda bu yapılandırma için seçeneklerinizi önermeye davet ediyoruz.