காப்புப் பிரதி பகுதி 2: rsync அடிப்படையிலான காப்புப் பிரதி கருவிகளை மதிப்பாய்வு செய்தல் மற்றும் சோதனை செய்தல்

காப்புப் பிரதி பகுதி 2: rsync அடிப்படையிலான காப்புப் பிரதி கருவிகளை மதிப்பாய்வு செய்தல் மற்றும் சோதனை செய்தல்
இந்தக் குறிப்பு தொடர்கிறது

காப்பு பற்றிய சுழற்சி

  1. காப்புப்பிரதி, பகுதி 1: காப்புப்பிரதி ஏன் தேவைப்படுகிறது, முறைகள், தொழில்நுட்பங்கள் பற்றிய கண்ணோட்டம்
  2. காப்புப்பிரதி பகுதி 2: rsync-அடிப்படையிலான காப்புப்பிரதி கருவிகளின் மதிப்பாய்வு மற்றும் சோதனை
  3. காப்புப் பிரதி பகுதி 3: நகல், நகல், தேஜா டூப் ஆகியவற்றை மதிப்பாய்வு செய்தல் மற்றும் சோதனை செய்தல்
  4. காப்புப் பிரதி பகுதி 4: zbackup, Restic, Borgbackup ஆகியவற்றை மதிப்பாய்வு செய்தல் மற்றும் சோதனை செய்தல்
  5. காப்புப்பிரதி பகுதி 5: லினக்ஸிற்கான பாகுலா மற்றும் வீம் காப்புப்பிரதியை சோதித்தல்
  6. காப்புப் பிரதி பகுதி 6: காப்புப் பிரதி கருவிகளை ஒப்பிடுதல்
  7. காப்பு பகுதி 7: முடிவுகள்

நாம் ஏற்கனவே முதல் கட்டுரையில் எழுதியது போல, rsync அடிப்படையில் காப்புப்பிரதிகள் மிக அதிக எண்ணிக்கையில் உள்ளன.

எங்கள் நிலைமைகளுக்கு மிகவும் பொருத்தமானவைகளில், நான் 3 ஐக் கருதுகிறேன்: rdiff-backup, rsnapshot மற்றும் burp.

கோப்புகளை சோதிக்கவும்

எதிர்கால கட்டுரைகள் உட்பட அனைத்து விண்ணப்பதாரர்களுக்கும் சோதனை கோப்பு தொகுப்புகள் ஒரே மாதிரியாக இருக்கும்.

முதல் தொகுப்பு: 10 ஜிபி மீடியா கோப்புகள், மற்றும் தோராயமாக 50 எம்பி - PHP இல் தளத்தின் மூலக் குறியீடு, மூலக் குறியீட்டிற்கான பல கிலோபைட்களிலிருந்து கோப்பு அளவுகள், மீடியா கோப்புகளுக்கான பத்து மெகாபைட்கள் வரை. நிலையான தளத்தைப் பின்பற்றுவதே குறிக்கோள்.

இரண்டாவது தொகுப்பு: 5 ஜிபி மீடியா கோப்புகளைக் கொண்ட துணை அடைவில் மறுபெயரிடும்போது முதல் ஒன்றிலிருந்து பெறப்பட்டது. கோப்பகத்தை மறுபெயரிடும்போது காப்புப்பிரதி அமைப்பின் நடத்தையைப் படிப்பதே குறிக்கோள்.

மூன்றாவது தொகுப்பு: 3ஜிபி மீடியா கோப்புகளை நீக்கி, புதிய 3ஜிபி மீடியா கோப்புகளைச் சேர்ப்பதன் மூலம் முதலில் பெறப்பட்டது. வழக்கமான தள புதுப்பிப்பு செயல்பாட்டின் போது காப்புப்பிரதி அமைப்பின் நடத்தையைப் படிப்பதே குறிக்கோள்.

முடிவுகளைப் பெறுதல்

எந்தவொரு காப்புப்பிரதியும் குறைந்தது 3 முறை செய்யப்படுகிறது மற்றும் கட்டளைகளுடன் கோப்பு முறைமை தற்காலிக சேமிப்புகளை மீட்டமைப்பதன் மூலம் இருக்கும் sync и echo 3 > /proc/sys/vm/drop_caches சோதனை சேவையகம் மற்றும் காப்பு சேமிப்பக சேவையகத்தின் பக்கத்திலும்.

காப்புப்பிரதிகளின் ஆதாரமாக இருக்கும் சேவையகத்தில், கண்காணிப்பு மென்பொருள் நிறுவப்பட்டுள்ளது - நெட்டேட்டா, இதன் உதவியுடன் நகலெடுக்கும் போது சேவையகத்தில் உள்ள சுமை மதிப்பிடப்படும், காப்புப்பிரதியின் போது சேவையகத்தில் உள்ள சுமையை மதிப்பிடுவதற்கு இது அவசியம்.

பிரதான சேவையகத்தை விட செயலியின் அடிப்படையில் காப்புப்பிரதி சேமிப்பக சேவையகம் மெதுவாக உள்ளது என்று நான் நம்புகிறேன், ஆனால் ஒப்பீட்டளவில் குறைந்த சீரற்ற எழுதும் வேகத்துடன் அதிக திறன் கொண்ட வட்டுகளைக் கொண்டுள்ளது - காப்புப்பிரதிகளின் போது மிகவும் பொதுவான சூழ்நிலை, மற்றும் காப்புப்பிரதி சேவையகம் இருக்கக்கூடாது என்பதன் காரணமாக. சரியாகச் செய்யுங்கள், நெட்டேட்டாவைப் பயன்படுத்தி காப்புப்பிரதியைத் தவிர மற்ற பணிகளை நான் கண்காணிக்க மாட்டேன்.

காப்புப்பிரதிக்கான பல்வேறு அமைப்புகளைச் சரிபார்க்கும் சேவையகங்களையும் மாற்றியுள்ளேன்.

இப்போது அவை பின்வரும் பண்புகளைக் கொண்டுள்ளனசெயலி

sysbench --threads=2 --time=30 --cpu-max-prime=20000 cpu run
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 2
Initializing random number generator from current time


Prime numbers limit: 20000

Initializing worker threads...

Threads started!

CPU speed:
    events per second:  1081.62

General statistics:
    total time:                          30.0013s
    total number of events:              32453

Latency (ms):
         min:                                    1.48
         avg:                                    1.85
         max:                                    9.84
         95th percentile:                        2.07
         sum:                                59973.40

Threads fairness:
    events (avg/stddev):           16226.5000/57.50
    execution time (avg/stddev):   29.9867/0.00

ரேம், வாசிப்பு...

sysbench --threads=4 --time=30 --memory-block-size=1K --memory-scope=global --memory-total-size=100G --memory-oper=read memory run
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 4
Initializing random number generator from current time


Running memory speed test with the following options:
  block size: 1KiB
  total size: 102400MiB
  operation: read
  scope: global

Initializing worker threads...

Threads started!

Total operations: 104857600 (5837637.63 per second)

102400.00 MiB transferred (5700.82 MiB/sec)


General statistics:
    total time:                          17.9540s
    total number of events:              104857600

Latency (ms):
         min:                                    0.00
         avg:                                    0.00
         max:                                   66.08
         95th percentile:                        0.00
         sum:                                18544.64

Threads fairness:
    events (avg/stddev):           26214400.0000/0.00
    execution time (avg/stddev):   4.6362/0.12

... மற்றும் பதிவு

sysbench --threads=4 --time=30 --memory-block-size=1K --memory-scope=global --memory-total-size=100G --memory-oper=write memory run
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 4
Initializing random number generator from current time


Running memory speed test with the following options:
  block size: 1KiB
  total size: 102400MiB
  operation: write
  scope: global

Initializing worker threads...

Threads started!

Total operations: 91414596 (3046752.56 per second)

89272.07 MiB transferred (2975.34 MiB/sec)


General statistics:
    total time:                          30.0019s
    total number of events:              91414596

Latency (ms):
         min:                                    0.00
         avg:                                    0.00
         max:                                 1022.90
         95th percentile:                        0.00
         sum:                                66430.91

Threads fairness:
    events (avg/stddev):           22853649.0000/945488.53
    execution time (avg/stddev):   16.6077/1.76

தரவு மூல சேவையகத்தில் வட்டு

sysbench --threads=4 --file-test-mode=rndrw --time=60 --file-block-size=4K --file-total-size=1G fileio run
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 4
Initializing random number generator from current time


Extra file open flags: (none)
128 files, 8MiB each
1GiB total file size
Block size 4KiB
Number of IO requests: 0
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
Initializing worker threads...

Threads started!


File operations:
    reads/s:                      4587.95
    writes/s:                     3058.66
    fsyncs/s:                     9795.73

Throughput:
    read, MiB/s:                  17.92
    written, MiB/s:               11.95

General statistics:
    total time:                          60.0241s
    total number of events:              1046492

Latency (ms):
         min:                                    0.00
         avg:                                    0.23
         max:                                   14.45
         95th percentile:                        0.94
         sum:                               238629.34

Threads fairness:
    events (avg/stddev):           261623.0000/1849.14
    execution time (avg/stddev):   59.6573/0.00

காப்பு சேமிப்பக சேவையகத்தில் வட்டு

sysbench --threads=4 --file-test-mode=rndrw --time=60 --file-block-size=4K --file-total-size=1G fileio run
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 4
Initializing random number generator from current time


Extra file open flags: (none)
128 files, 8MiB each
1GiB total file size
Block size 4KiB
Number of IO requests: 0
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
Initializing worker threads...

Threads started!


File operations:
    reads/s:                      11.37
    writes/s:                     7.58
    fsyncs/s:                     29.99

Throughput:
    read, MiB/s:                  0.04
    written, MiB/s:               0.03

General statistics:
    total time:                          73.8868s
    total number of events:              3104

Latency (ms):
         min:                                    0.00
         avg:                                   78.57
         max:                                 3840.90
         95th percentile:                      297.92
         sum:                               243886.02

Threads fairness:
    events (avg/stddev):           776.0000/133.26
    execution time (avg/stddev):   60.9715/1.59

சேவையகங்களுக்கு இடையே பிணைய வேகம்

iperf3 -c backup
Connecting to host backup, port 5201
[  4] local x.x.x.x port 59402 connected to y.y.y.y port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   419 MBytes  3.52 Gbits/sec  810    182 KBytes
[  4]   1.00-2.00   sec   393 MBytes  3.30 Gbits/sec  810    228 KBytes
[  4]   2.00-3.00   sec   378 MBytes  3.17 Gbits/sec  810    197 KBytes
[  4]   3.00-4.00   sec   380 MBytes  3.19 Gbits/sec  855    198 KBytes
[  4]   4.00-5.00   sec   375 MBytes  3.15 Gbits/sec  810    182 KBytes
[  4]   5.00-6.00   sec   379 MBytes  3.17 Gbits/sec  765    228 KBytes
[  4]   6.00-7.00   sec   376 MBytes  3.15 Gbits/sec  810    180 KBytes
[  4]   7.00-8.00   sec   379 MBytes  3.18 Gbits/sec  765    253 KBytes
[  4]   8.00-9.00   sec   380 MBytes  3.19 Gbits/sec  810    239 KBytes
[  4]   9.00-10.00  sec   411 MBytes  3.44 Gbits/sec  855    184 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  3.78 GBytes  3.25 Gbits/sec  8100             sender
[  4]   0.00-10.00  sec  3.78 GBytes  3.25 Gbits/sec                  receiver

சோதனை முறை

  1. சோதனைச் சேவையகத்தில், முதல் சோதனைத் தொகுப்பைக் கொண்ட கோப்பு முறைமை தயாரிக்கப்பட்டு, காப்புப் பிரதி சேமிப்பக சேவையகத்தில், தேவைப்பட்டால், களஞ்சியம் துவக்கப்படும்.
    காப்புப் பிரதி செயல்முறை தொடங்கப்பட்டு அதன் நேரம் அளவிடப்படுகிறது.
  2. சோதனை சேவையகத்தில், கோப்புகள் இரண்டாவது சோதனைத் தொகுப்பிற்கு மாற்றப்படும். காப்புப் பிரதி செயல்முறை தொடங்கப்பட்டு அதன் நேரம் அளவிடப்படுகிறது.
  3. சோதனை சேவையகத்தில், இடம்பெயர்வு மூன்றாவது சோதனைத் தொகுப்பு வரை மேற்கொள்ளப்படுகிறது. காப்புப் பிரதி செயல்முறை தொடங்கப்பட்டு அதன் நேரம் அளவிடப்படுகிறது.
  4. இதன் விளைவாக வரும் மூன்றாவது சோதனைத் தொகுப்பு புதிய முதலாவதாக ஏற்றுக்கொள்ளப்படுகிறது; 1-3 படிகள் 2 முறை மீண்டும் மீண்டும் செய்யப்படுகின்றன.
  5. தரவு பிவோட் அட்டவணையில் உள்ளிடப்பட்டு, நெட்டேட்டாவுடன் வரைபடங்கள் சேர்க்கப்படும்.
  6. தனிப்பட்ட காப்புப் பிரதி முறைக்காக ஒரு அறிக்கை உருவாக்கப்படுகிறது.

எதிர்பார்த்த முடிவுகள்

அனைத்து 3 வேட்பாளர்களும் ஒரே தொழில்நுட்பத்தை (rsync) அடிப்படையாகக் கொண்டிருப்பதால், முடிவுகள் வழக்கமான rsyncக்கு நெருக்கமாக இருக்கும் என்று எதிர்பார்க்கப்படுகிறது, இதில் அதன் அனைத்து நன்மைகளும் அடங்கும், அதாவது:

  1. களஞ்சியத்தில் உள்ள கோப்புகள் "அப்படியே" சேமிக்கப்படும்.
  2. காப்புப்பிரதிகளுக்கு இடையிலான வேறுபாடு உட்பட களஞ்சிய அளவு மட்டுமே வளரும்.
  3. தரவை மாற்றும்போது நெட்வொர்க்கில் ஒப்பீட்டளவில் பெரிய சுமை இருக்கும், அதே போல் செயலியில் ஒரு சிறிய சுமையும் இருக்கும்.

வழக்கமான rsync இன் சோதனை ஓட்டம், அதன் முடிவுகள் குறிப்புகளாகப் பயன்படுத்தப்படும்

இவைகாப்புப் பிரதி பகுதி 2: rsync அடிப்படையிலான காப்புப் பிரதி கருவிகளை மதிப்பாய்வு செய்தல் மற்றும் சோதனை செய்தல்

HDD-அடிப்படையிலான வட்டு வடிவில் காப்புப் பிரதி தரவு சேமிப்பக சேவையகத்தில் இடையூறு இருந்தது, இது சா-டூத் வரைபடங்களில் தெளிவாகத் தெரியும்.

தரவு 4 நிமிடங்கள் மற்றும் 15 வினாடிகளில் நகலெடுக்கப்பட்டது.

rdiff-backup ஐ சோதிக்கிறது

முதல் வேட்பாளர் rdiff-backup ஆகும், ஒரு பைதான் ஸ்கிரிப்ட் ஒரு கோப்பகத்தை மற்றொரு கோப்பகத்திற்கு காப்புப் பிரதி எடுக்கும். இந்த வழக்கில், தற்போதைய காப்பு பிரதி "அப்படியே" சேமிக்கப்படுகிறது, மேலும் முன்னர் செய்யப்பட்ட காப்பு பிரதிகள் ஒரு சிறப்பு துணை அடைவில் படிப்படியாக சேமிக்கப்படும், இதனால் இடத்தை சேமிக்கவும்.

வழக்கமான இயக்க முறைமையை நாங்கள் சரிபார்ப்போம், அதாவது. காப்புப்பிரதி செயல்முறையின் துவக்கமானது கிளையண்டாலேயே தொடங்கப்படுகிறது, மேலும் காப்புப்பிரதிக்கான சேவையகப் பக்கத்தில், தரவைப் பெறும் ஒரு செயல்முறை தொடங்கப்படுகிறது.

வாருங்கள் பார்ப்போம், எங்கள் நிலைமைகளில் அவர் என்ன திறன் கொண்டவர்?.

காப்புப் பிரதி பகுதி 2: rsync அடிப்படையிலான காப்புப் பிரதி கருவிகளை மதிப்பாய்வு செய்தல் மற்றும் சோதனை செய்தல்

ஒவ்வொரு சோதனை ஓட்டத்தின் இயங்கும் நேரம்:

முதலில் தொடங்குங்கள்
இரண்டாவது ஓட்டம்
மூன்றாவது ஏவுதல்

முதல் தொகுப்பு
16 மீ32 வி
16 மீ26 வி
16 மீ19 வி

இரண்டாவது தொகுப்பு
2 ம 5 மீ
2 ம 10 மீ
2 ம 8 மீ

மூன்றாவது தொகுப்பு
2 ம 9 மீ
2 ம 10 மீ
2 ம 10 மீ

Rdiff-backup ஆனது தரவுகளில் ஏற்படும் எந்தப் பெரிய மாற்றத்திற்கும் மிகவும் வேதனையுடன் செயல்படுகிறது, மேலும் நெட்வொர்க்கை முழுமையாகப் பயன்படுத்தாது.

rsnapshot சோதனை

இரண்டாவது கேண்டிடேட், rsnapshot, ஒரு பெர்ல் ஸ்கிரிப்ட் ஆகும், அதன் பயனுள்ள செயல்பாட்டிற்கான முக்கிய தேவை கடினமான இணைப்புகளுக்கான ஆதரவாகும். இது வட்டு இடத்தை சேமிக்கிறது. இந்த வழக்கில், முந்தைய காப்புப்பிரதியிலிருந்து மாறாத கோப்புகள் கடினமான இணைப்புகளைப் பயன்படுத்தி அசல் கோப்புடன் இணைக்கப்படும்.

காப்புப்பிரதி செயல்முறையின் தர்க்கமும் தலைகீழாக உள்ளது: சேவையகம் அதன் வாடிக்கையாளர்களிடையே தீவிரமாக "நடந்து" தரவை எடுக்கும்.

சோதனை முடிவுகள்

பின்வரும் மாறியதுகாப்புப் பிரதி பகுதி 2: rsync அடிப்படையிலான காப்புப் பிரதி கருவிகளை மதிப்பாய்வு செய்தல் மற்றும் சோதனை செய்தல்

முதலில் தொடங்குங்கள்
இரண்டாவது ஓட்டம்
மூன்றாவது ஏவுதல்

முதல் தொகுப்பு
4 மீ22 வி
4 மீ19 வி
4 மீ16 வி

இரண்டாவது தொகுப்பு
2 மீ6 வி
2 மீ10 வி
2 மீ6 வி

மூன்றாவது தொகுப்பு
1 மீ18 வி
1 மீ10 வி
1 மீ10 வி

இது rdiff-backup ஐ விட மிக மிக விரைவாகவும், மிக வேகமாகவும், pure rsyncக்கு மிக நெருக்கமாகவும் வேலை செய்தது.

பர்ப் சோதனை

மற்றொரு விருப்பம் librsync - burp-ன் மேல் ஒரு C செயல்படுத்தல் ஆகும், இது கிளையன்ட் அங்கீகாரம் உட்பட கிளையன்ட்-சர்வர் கட்டமைப்பைக் கொண்டுள்ளது, அத்துடன் ஒரு வலை இடைமுகம் (அடிப்படை தொகுப்பில் சேர்க்கப்படவில்லை). மற்றொரு சுவாரஸ்யமான அம்சம் கிளையன்ட் பக்க மீட்பு அல்லாத காப்புப்பிரதிகள் ஆகும்.

ஒரு முறை பார்க்கலாம்செயல்திறன்.

காப்புப் பிரதி பகுதி 2: rsync அடிப்படையிலான காப்புப் பிரதி கருவிகளை மதிப்பாய்வு செய்தல் மற்றும் சோதனை செய்தல்

முதலில் தொடங்குங்கள்
இரண்டாவது ஓட்டம்
மூன்றாவது ஏவுதல்

முதல் தொகுப்பு
11 மீ21 வி
11 மீ10 வி
10 மீ56 வி

இரண்டாவது தொகுப்பு
5 மீ37 வி
5 மீ40 வி
5 மீ35 வி

மூன்றாவது தொகுப்பு
3 மீ33 வி
3 மீ24 வி
3 மீ40 வி

இது rsnapshot ஐ விட 2 மடங்கு மெதுவாக வேலை செய்தது, ஆனால் இன்னும் மிக வேகமாகவும், நிச்சயமாக rdiff-backup ஐ விட வேகமாகவும் வேலை செய்தது. கிராஃப்கள் ஒரு பிட் சாடூத் - செயல்திறன் மீண்டும் காப்பு சேமிப்பக சேவையகத்தின் வட்டு துணை அமைப்பைப் பொறுத்தது, இருப்பினும் இது rsnapshot உடன் உச்சரிக்கப்படவில்லை.

Результаты

அனைத்து விண்ணப்பதாரர்களுக்கான களஞ்சியங்களின் அளவு தோராயமாக ஒரே மாதிரியாக இருந்தது, அதாவது, முதலில் 10 ஜிபி, பின்னர் 15 ஜிபி, பின்னர் 18 ஜிபி என வளரும், இது rsync இன் தனித்தன்மையின் காரணமாகும். அனைத்து வேட்பாளர்களும் ஒற்றை-திரிக்கப்பட்டவர்கள் என்பதும் கவனிக்கத்தக்கது (டூயல் கோர் இயந்திரத்தில் செயலி சுமை சுமார் 50% ஆகும்). அனைத்து 3 வேட்பாளர்களும் கடைசி காப்புப்பிரதியை "அப்படியே" மீட்டெடுக்கும் திறனை வழங்கினர், அதாவது, களஞ்சியங்களை உருவாக்கப் பயன்படுத்தப்பட்டவை உட்பட எந்த மூன்றாம் தரப்பு நிரல்களையும் பயன்படுத்தாமல் கோப்புகளை மீட்டமைக்க முடியும். இது rsync இன் "மூதாதையர் மரபு" ஆகும்.

கண்டுபிடிப்புகள்

காப்புப்பிரதி அமைப்பு மிகவும் சிக்கலானது மற்றும் வேறுபட்ட திறன்களைக் கொண்டுள்ளது, அது மெதுவாக வேலை செய்யும், ஆனால் மிகவும் கோராத திட்டங்களுக்கு அவற்றில் ஏதேனும் பொருத்தமானதாக இருக்கும், ஒருவேளை, rdiff-backup தவிர.

அறிவிப்பு

இந்தக் குறிப்பு காப்புப்பிரதி பற்றிய சுழற்சியைத் தொடர்கிறது

காப்புப்பிரதி, பகுதி 1: காப்புப்பிரதி ஏன் தேவைப்படுகிறது, முறைகள், தொழில்நுட்பங்கள் பற்றிய கண்ணோட்டம்
காப்புப் பிரதி பகுதி 2: rsync அடிப்படையிலான காப்புப் பிரதி கருவிகளை மதிப்பாய்வு செய்தல் மற்றும் சோதனை செய்தல்
காப்புப் பிரதி பகுதி 3: நகல், நகல், தேஜா டூப் ஆகியவற்றை மதிப்பாய்வு செய்தல் மற்றும் சோதனை செய்தல்
காப்புப் பிரதி பகுதி 4: zbackup, Restic, Borgbackup ஆகியவற்றை மதிப்பாய்வு செய்தல் மற்றும் சோதனை செய்தல்
காப்புப்பிரதி பகுதி 5: லினக்ஸிற்கான பாகுலா மற்றும் வீம் காப்புப்பிரதியை சோதித்தல்
காப்புப் பிரதி பகுதி 6: காப்புப் பிரதி கருவிகளை ஒப்பிடுதல்
காப்பு பகுதி 7: முடிவுகள்

பதிப்பகத்தின் ஆசிரியர்: பாவெல் டெம்கோவிச்

ஆதாரம்: www.habr.com

கருத்தைச் சேர்