Drobo as Primary Storage Considered Harmful?

Fri, Mar 20, 2009 with tags io , storage , drobo , mythtv
Advertisement from mwave.com billing Drobo as your new Primary Storage

Advertisement from mwave.com billing Drobo as your new Primary Storage

In October 2008 I purchased a 1st generation Drobo to provide additional storage space for my growing collection of recordings from MythTV. The plan was to use the Drobo as primary storage for MythTV recordings, something I believed to be acceptable because recording high-definition television maxes out at a couple of megabytes a second. The Drobo is equipped with a USB2 connection and should be able to push well more than that. The Drobo also provided some great advantages, such as on the fly addition of disks to the array, and data redundancy. Along with the Drobo I purchased two Western Digital 1TB green drives. After migrating some drives from my old array I had a Drobo with 2x1TB and 2x320GB drives. I was able to take the number of drives in the actual case for my MythTV box down to just two, and in the process, reduce heat and noise from the machine.

I’m now about five months into this little experiment, and it’s been met with mixed results. After installing the Drobo I had about 700GB of a 1.6TB drive occupied. Writes were fast and I never had problems with recording multiple shows, watching recordings, and even transcoding recordings all at the same time. However, the Drobo allowed me to be lazy, I no longer needed to worry about diligently transcoding recordings. Soon I found my 1.6TB drive filling up and yellow lights appeared telling me that I had better upgrade a disk in the array. Rather than inserting a new disk, I took the opportunity to transcode hundreds of recordings from MythTV. When combined with cutting commercials and a small decrease in resolution, I can take a 4GB HDTV episode of the Office and drop it down to around 500MB with little degradation.

At this point I started to notice issues with MythTV under heavy usage. On Monday nights I often have both HD tuners recording, an analog tuner recording, transcode jobs running, commercials being flagged, and I’m often watching a high def program. This actually maxes out to a little under 10MB/s, something the Drobo should be able to do with little problem. However, recordings from that evening would frequently end up missing small bits of video and jumping ahead. For some shows this was no problem, but it could miss a critical moment in a show like 24. I quickly identified the problem as the Drobo not being able to keep up with the requests. During some down time I used Bonnie++ to calculate a synthetic estimate of disk throughput – the results were downright ugly for the Drobo:

    Version 1.03c       ------Sequential Output------ --Sequential Input- --Random-
                        -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
    Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
    spongebob        4G 10260  40 14116   8  8107   5 16746  57 18169   3  61.5   0
                        ------Sequential Create------ --------Random Create--------
                        -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
                  files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                     16 10085  40 +++++ +++ +++++ +++ 26325  98 +++++ +++ +++++ +++

For comparison, here is the output of Bonnie++ on a 320GB internal hard disk:

    Version 1.03c       ------Sequential Output------ --Sequential Input- --Random-
                        -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
    Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
    spongebob        4G 42271  94 55788  31 28871  14 50686  96 71219  16 128.7   1
                        ------Sequential Create------ --------Random Create--------
                        -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
                  files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                     16 22504  96 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++

I’ve put the most relevant stats in red bold. In the case of the Drobo, creating files at the block level, which should be the fastest results in a throughput of about 14MB/s, while the 320GB internal hard disk whizzes by at 55MB/s. Likewise, the read rates are dramatically different, Drobo maxes out at 18MB/s, while the single internal hard drive reads at 71MB/s. For comparison, my 4 drive software RAID 5 array used to read at 106MB/s.

Under most circumstances, switching to a disk array results in an increase in performance. Both writes and reads are spread out across multiple disks, reducing issues with seek time and allowing parallel reads and writes. However, that is clearly not the case with the Drobo. Much of the bottleneck is probably a result of the USB2 interface to the Drobo, however, that cannot be the entire reason for the slow throughput. Many other people have noted the slow performance of the Drobo (see MaximumPC, Mac360, and CNet reviews). On occasion a reviewer will get slightly confused because the device automatically slows down as it gets closer to being full – this is ensure you have enough time to get another hard disk and replace a smaller one. But what’s really strange is how sometimes the Drobo just stops writing for a period of seconds at a time. Here’s some output from dstat when copying a large file from an internal hard drive to the Drobo:

    ----total-cpu-usage---- --dsk/sdc1- -net/total- ---paging-- ---system--
    usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw
      1  14   0  83   0   1|   0    21M| 236B 1064B|   0     0 |1675  3260
      3  14   0  81   0   2|   0    24M| 590B  448B|   0     0 |1745  3456
      3  17   0  79   0   2|4096B   21M| 236B  448B|   0     0 |1728  3416
     12  13   0  71   0   3|   0    26M|  29k   29k|   0     0 |1784  3654
      6  33   0  59   0   3|   0    23M| 907B 1139B|   0  8192B|2020  3285
      2  10   0  86   0   2|   0    18M| 596B 3586B|   0     0 |1708  3487
      3  17   0  77   0   2|   0    20M|6262B 3530B|   0     0 |1830  3684
      4  16   0  77   0   4|   0    24M| 354B  448B|   0     0 |1952  4022
      9  12   0  77   1   2|4096B   21M|5203B 8709B|   0     0 |1843  3875
     14   9   0  76   0   3|   0    22M|4848B 5200B|   0     0 |1938  4340
      5  29   0  65   1   2|   0    16M| 224B  586B|   0     0 |1686  3143
      4  12   0  82   0   1|   0  7684k| 354B  464B|   0     0 |1370  2609
      2   5   0  92   0   1|   0  6580k| 416B  536B|   0     0 |1118  2147
      2   9   0  89   1   1|   0  8856k| 210B  510B|   0     0 |1290  2449
      1   6   0  92   0   1|   0  7860k| 462B  600B|   0     0 |1177  2131
      2   3   0  94   0   1|   0  7156k| 328B  560B|   0     0 |1094  1970
      3   4   0  94   0   1|   0  8192k| 578B  798B|   0     0 |1090  2017
      2   3   0  95   0   1|   0  3616k| 573B  743B|   0     0 | 966  1605
      2   5   0  92   0   0|   0   920k| 354B  464B|   0     0 | 939  1610
      5  12   0  82   0   1|4096B 5656k|3555B 3787B|   0     0 |1239  2240
     25  21   0  53   0   1|   0  2416k|  38k   39k|   0     0 |1105  2323
      7   6   0  86   0   0|   0  3120k| 524B  894B|   0     0 |1032  1833
      7   7   0  85   0   0|   0  6152k| 925B 1673B|   0     0 |1153  2040
      4   4   0  93   0   1|   0   960k| 708B  680B|   0     0 | 947  1683
      8  15  27  50   0   0|   0  2176k|3086B 3121B|   0     0 | 973  1587
      6  30  48  16   0   1|   0  1080k|5286B 5664B|   0     0 | 936  1397
      6   5  49  39   0   1|   0   960k|8552B 8820B|   0     0 | 954  1606
      9  18  49  24   0   0|   0     0 |6230B 6486B|   0     0 | 919  1454
      7  28  49  16   0   0|   0     0 |  10k   11k|   0     0 | 897  1313
      4   4  49  43   0   1|   0     0 | 811B 1123B|   0     0 | 945  1690
      3   3  48  46   0   0|   0     0 | 236B  464B|   0     0 | 910  1553
      4   3  50  44   0   0|   0     0 | 250B  584B|   0     0 | 965  1760
      2   2   0  96   1   0|   0   584k| 354B  432B|   0     0 | 927  1589
      4   4   0  92   0   1|   0   120k| 236B  432B|   0     0 | 866  1437
      5   5   0  89   0   0|   0     0 | 118B  432B|   0     0 | 864  1520
      4   4   0  92   0   0|   0   600k| 236B  432B|   0     0 | 910  1631
      5   5   0  90   0   0|   0   960k| 354B  432B|   0     0 | 880  1588
      5   5   0  89   0   1|   0  1680k| 236B  448B|   0     0 | 923  1495
     13  29   0  57   1   0|   0    11M|  14k   14k|   0     0 |1341  2112
      8   5   0  87   1   0|   0  6704k|1693B 2067B|   0     0 |1094  1948

I’ve highlighted the amount of data being written to the Drobo in red, where you can see that for extended periods of the file copy the Drobo decides it would rather not write anything. What’s interesting is that this occurred right after the Drobo went into what seemed like a “Turbo Mode”, writing at rates of over 20MB/s. Clearly, this is a problem, and such blocking of writes mean that Drobo cannot be used as a primary storage device for MythTV. It works wonderful for playing back of recorded programs, storing music files, a drive for my photographs, but anything where streaming directly to disk is required is not a good idead for the Drobo.

However, I have an alternative solution.

MythTV has the concept of Storage Groups. Originally they were designed to force MythTV to load balance recordings across multiple drives. When a recording is selected it appears that MythTV scans all storage groups for the recording. The solution I have adopted is to put the default recording group on an internal harddrive and create another storage group, called “Long Term”, which features the Drobo. Periodically I then copy the files from the internal hard drive to the Drobo, thus ensuring that I always have enough space to record more. Since I’ve done this I haven’t noticed any issues with disk load causing corruptions of recorded files.