30 ruble için Beyin + VPS =?

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.

30 ruble için Beyin + VPS =?
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

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

Sonuçlar gösterge niteliğindedir ancak yine de QoS olarak alınmamalıdır. 

Ek yük oluşturan makineler

Yazılım:

  • apt-get update
  • apt-get yükseltmesi
  • apt-get install python-pip
  • pip mysql-konektör-python-rf kurulumunu yapın

MariaDB Yüklendi, Nasıl Yapılır burada:

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

Alınan test tabanı bundan dolayı:

Veritabanı belirtildiği gibi dağıtılır burada:

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

Küçük test tabanı:

tablo 

Satır Sayısı 

Veri boyutu (MB)

Dizin boyutu (KB)

bölümler 

9

0.02

16.00

borç_emp 

331143 

11.52

5648.00

departman yöneticisi 

24 

0.02

16.00

çalışanların 

299379 

14.52

0.00

maaşlar 

2838426 

95.63

0.00 

başlıkları 

442783 

19.56

0.00

Python'da diz üzerine ilkel bir test servisi yazılmıştır; dört işlem gerçekleştirir:

  1. getState: durumu döndürür
  2. getEmployee: veritabanından çalışanları (+maaşlar, +unvanlar) döndürür
  3. patchEmployee: çalışan alanlarını değiştirir
  4. insertSalary: maaş ekler

Hizmet kaynağı (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')

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.

Kaynak: habr.com

Yorum ekle