मैं ZFS के लिए पूरी तरह से नया हूं, इसलिए मैंने सोचा कि मैं इसके बारे में कुछ सरल बेंचमार्क करूं कि यह कैसे व्यवहार करता है। मैं इसके प्रदर्शन की सीमा को आगे बढ़ाना चाहता था इसलिए मैंने अमेज़ॅन ईसी 2 i2.8xlargeउदाहरण (लगभग $ 7 / घंटा, समय वास्तव में पैसा है!) का प्रावधान किया । इस उदाहरण में 8 800GB SSD हैं।
मैंने fioखुद SSDs पर एक परीक्षण किया, और निम्न आउटपुट (छंटनी) प्राप्त किया:
$ sudo fio --name randwrite --ioengine=libaio --iodepth=2 --rw=randwrite --bs=4k --size=400G --numjobs=8 --runtime=300 --group_reporting --direct=1 --filename=/dev/xvdb
[trimmed]
write: io=67178MB, bw=229299KB/s, iops=57324, runt=300004msec
[trimmed]
4K रैंडम राइट्स के लिए 57K IOPS। सम्मानजनक।
मैंने तब सभी में फैले हुए एक ZFS वॉल्यूम को बनाया। पहले तो मेरे पास raidz1सभी 8 SSDs के साथ एक vdev था , लेकिन मैंने उन कारणों के बारे में पढ़ा जो प्रदर्शन के लिए खराब हैं, इसलिए मैंने चार mirrorvdevs के साथ समाप्त किया , जैसे:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi
$ sudo zpool list -v
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
testpool 2.91T 284K 2.91T - 0% 0% 1.00x ONLINE -
mirror 744G 112K 744G - 0% 0%
xvdb - - - - - -
xvdc - - - - - -
mirror 744G 60K 744G - 0% 0%
xvdd - - - - - -
xvde - - - - - -
mirror 744G 0 744G - 0% 0%
xvdf - - - - - -
xvdg - - - - - -
mirror 744G 112K 744G - 0% 0%
xvdh - - - - - -
xvdi - - - - - -
मैंने रिकॉर्ड को 4K पर सेट किया और अपना परीक्षण चलाया:
$ sudo zfs set recordsize=4k testpool
$ sudo fio --name randwrite --ioengine=libaio --iodepth=2 --rw=randwrite --bs=4k --size=400G --numjobs=8 --runtime=300 --group_reporting --filename=/testpool/testfile --fallocate=none
[trimmed]
write: io=61500MB, bw=209919KB/s, iops=52479, runt=300001msec
slat (usec): min=13, max=155081, avg=145.24, stdev=901.21
clat (usec): min=3, max=155089, avg=154.37, stdev=930.54
lat (usec): min=35, max=155149, avg=300.91, stdev=1333.81
[trimmed]
मुझे इस ZFS पूल पर केवल 52K IOPS मिलता है। यह वास्तव में एक SSD की तुलना में थोड़ा खराब है।
मुझे समझ नहीं आ रहा है कि मैं यहाँ क्या कर रहा हूँ। क्या मैंने ZFS को गलत तरीके से कॉन्फ़िगर किया है, या यह ZFS के प्रदर्शन की खराब परीक्षा है?
ध्यान दें, मैं आधिकारिक 64-बिट CentOS 7 HVM छवि का उपयोग कर रहा हूं, हालांकि मैंने 4.4.5 elrepo कर्नेल में अपग्रेड किया है:
$ uname -a
Linux ip-172-31-43-196.ec2.internal 4.4.5-1.el7.elrepo.x86_64 #1 SMP Thu Mar 10 11:45:51 EST 2016 x86_64 x86_64 x86_64 GNU/Linux
मैंने यहाँ सूचीबद्ध zfs रेपो से ZFS स्थापित किया । मेरे पास zfsपैकेज का संस्करण 0.6.5.5 है ।
अद्यतन : प्रति @ ewwhite का सुझाव मैंने कोशिश की ashift=12और ashift=13:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=12 -f
तथा
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=13 -f
इनमें से किसी ने भी कोई अंतर नहीं किया। जो मैं समझता हूं कि नवीनतम जेडएफएस बिट्स 4K एसएसडी की पहचान करने और उचित चूक का उपयोग करने के लिए पर्याप्त स्मार्ट हैं।
मैंने हालांकि यह देखा कि CPU उपयोग स्पाइकिंग है। @ टिम ने यह सुझाव दिया लेकिन मैंने इसे खारिज कर दिया लेकिन मुझे लगता है कि मैं सीपीयू को लंबे समय तक नोटिस नहीं कर रहा था। इस उदाहरण में 30 सीपीयू कोर जैसे कुछ हैं, और सीपीयू का उपयोग 80% तक बढ़ रहा है। भूख प्रक्रिया? z_wr_issइसके उदाहरण बहुत सारे हैं।
मैंने पुष्टि की कि संपीड़न बंद है, इसलिए यह संपीड़न इंजन नहीं है।
मैं raidz का उपयोग नहीं कर रहा हूं, इसलिए यह समता गणना नहीं होनी चाहिए।
मैंने किया था perf topऔर यह _raw_spin_unlock_irqrestoreअंदर z_wr_int_4और बाहर बिताए गए अधिकांश कर्नेल समय को दिखाता osq_lockहै z_wr_iss।
मुझे अब विश्वास है कि इस प्रदर्शन में अड़चन के लिए एक सीपीयू घटक है, हालांकि मैं यह पता लगाने के लिए करीब नहीं हूं कि यह क्या हो सकता है।
अद्यतन 2 : प्रति @ewwhite और अन्य लोगों के सुझाव कि यह इस वातावरण की आभासीकृत प्रकृति है जो प्रदर्शन अनिश्चितता पैदा करती है, मैं fioपर्यावरण में एसएसडी के चार में फैले यादृच्छिक 4K लिखता था। प्रत्येक SSD अपने आप में ~ 55K IOPS देता है, इसलिए मुझे उम्मीद है कि उनमें से चार के आसपास 240K IO होंगे। मुझे कमोबेश यही मिला:
$ sudo fio --name randwrite --ioengine=libaio --iodepth=8 --rw=randwrite --bs=4k --size=398G --numjobs=8 --runtime=300 --group_reporting --filename=/dev/xvdb:/dev/xvdc:/dev/xvdd:/dev/xvde
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=8
...
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=8
fio-2.1.5
Starting 8 processes
[trimmed]
write: io=288550MB, bw=984860KB/s, iops=246215, runt=300017msec
slat (usec): min=1, max=24609, avg=30.27, stdev=566.55
clat (usec): min=3, max=2443.8K, avg=227.05, stdev=1834.40
lat (usec): min=27, max=2443.8K, avg=257.62, stdev=1917.54
[trimmed]
यह स्पष्ट रूप से पर्यावरण को दिखाता है, हालांकि यह हो सकता है कि मैं देख रहा हूं की तुलना में IOPS को बनाए रख सकता है। जेडएफएस को लागू करने के तरीके के बारे में कुछ इसे शीर्ष गति से रखने से है। मैं अभी पता नहीं लगा सकता कि वह क्या है।