text:
OWC Mercury Extreme SSD - First Look at a 50GB SandForce Driveby Anand Lal Shimpi on 2/26/2010 12:00 AM EST
- Posted in
- Storage
74 Comments
Back to Article
ayembee - Tuesday, March 09, 2010 - link...given my 200GB Vertex 2 LE lasted 6 days :
however, based on the OCZ support forums it could be the OCZ firmware rather than a specific hardware issue, as it seems they they are getting very similar-sounding bricks on several kinds of vertex models. Reply
Hrel - Sunday, March 07, 2010 - linkNow I only need to wait for SSD's in this price range to drop under $1 per GB; and let me add that after getting used to 12cents per GB I think I'm being extremely generous! Reply
OWC Grant - Monday, March 01, 2010 - linkAs far as reselling review units, most manufacturers DO sell their review units and other products clearly marked as "open box", B stock, or refurbished and thus provide users with another purchase option. We offer these types of products in our monthly "clearance/garage sale" promo and are very well liked by our newsletter readers as great "insider" deals.
Our statement of all the drive sizes (50/100/200GB) offering the same performance in terms of raw sustained data transfer rates was and is still true. As noted in Anand's final summary and direct communication with us, the overall performance of the 50GB model "looks quite good" and "performance is nearly identical in call cases except one." (a small random write file) We are looking into that one instance and will advise on any outcome.
Thanks as always to Anand and you readers for your interest in SSD's in general and our offerings in that category. Reply
jed22281 - Friday, March 26, 2010 - link"As noted in Anand's final summary and direct communication with us, the overall performance of the 50GB model "looks quite good" and "performance is nearly identical in call cases except one." (a small random write file) We are looking into that one instance and will advise on any outcome."
So what was the outcome?
Thank-you. Reply
skimike - Monday, May 03, 2010 - linkOut of curiosity, do you know if OWC has a secure/sanity erase utility for the OWC Mercury Extreme 100GB drive? I called OWC's tech support line and they didn't know anything about it. And the drive password used by hdparm in Linux isn't set to NULL so I can't use hdparm, either. Reply
monomer - Monday, March 01, 2010 - linkDailytech posted an article on Friday saying that JMicron will be releasing a new controller with a 128MB DRAM cache soon. Does anyone know if they actually fixed their random access problems, or did they just throw more cache at it to try to cover it up? Reply
tuskers - Monday, March 01, 2010 - linkSomething I'd love to see is how much software compile times improve with an SSD. As a professional software engineer, I'd love to see whether SSDs would improve a common real-world task like this. Reply
hyc - Monday, March 01, 2010 - linkYes, noticeably.
I write code all day. All of my machines now have SSDs as their primary drive. 256GB G.Skill Titan in my desktop, 256GB Samsung in my current laptop, 128GB Transcend PATA in my old laptop, 120GB OCZ CoreV2 floating on an eSata adapter for quick bulk copies. Reply
arklab - Monday, March 01, 2010 - linkPardon my ignorance, but I'm new to SSD's.
I (think) I read in your first review that only Sand Force is able to make utilities for these (OWC and OCZ LE) drives.
Does this include the trim command (for Windows 7 use), or can we just use some "generic" command?
What would OSX users do?
Thanks! Reply
fictionfree - Monday, March 01, 2010 - linkI've purchased a couple items from OWC in the past - can't say I'm a fan of the company. It wouldn't surprise me if they resold review drives. I purchased an external Firewire drive from them a few years ago, and when the internal drive died, I took the case apart to see that it was a refurbished drive. I didn't buy a refurb drive, I bought a brand new drive - but they filled the case with a refurb. Not cool - and they refused to do anything to make it right.
Just my 2 cents, but I find them to be shady. Reply
Kiru - Monday, March 01, 2010 - linkI've bought a bunch of stuff from OWC (3 external Fire wire drives, and 18 gigs of memory), and had no issues with RMAs when I've needed to (the power supply for one of my externals died). I've had just as many issues with faulty product from New Egg as from anywhere else. But that refurb story IS definitely a pisser. I'm surprised they didn't work with you on that. Reply
mobilehavoc - Saturday, February 27, 2010 - linkIt's pricey at $800 but still cheaper than the OCZ Vertex LE. I'll be running it in a Macbook with Snow Leopard so internal GC is a nice feature since no TRIM support.
Any chance these will be upgradeable via firmware in the future? Or is it you buy the drive and that's it? I'm just nervous about buying something that may not be properly supported for times to come. Reply
Di22yDucRydr1198 - Saturday, February 27, 2010 - linkDo any SSDs support this format which is starting to appear on some conventional HDDs? If one has an Advanced format HDD for storage and a SSD for OS and apps, will the two work together without a hitch?
Why is that the Crucial RealSSD C300 256GB falls off so dramatically on the 4k random write aligned to 512-byte sectors?
Thanks for your efforts on this and all the preceeding SSD articles. Reply
Griswold - Sunday, February 28, 2010 - linkI dont think there needs to be advanced format compatibility with SSDs. Reply
hyc - Monday, March 01, 2010 - linkAnd you're completely wrong. Advanced format brings similar benefits to SSDs as for HDDs. Not to mention that most SSDs are already using multiple-of-4KB erase blocks, so it actually has *more* benefit than for HDDs.
Anand, your "aligned" random write result for the 50GB drive looks identical to your unaligned result. This looks like a test error to me. At worst, the difference in peak performance should be a factor of 2, due to using half as many channels in the 50GB drive vs the 100GB drive. I think you need to reformat that drive and repeat that test. Reply
kunedog - Saturday, February 27, 2010 - linkAt last we get an acknowledgement of the market prices of the G2 X-25M, now that they're finally where they were supposed to be at release. It only took six months for your predictions to come true!
http://www.anandtech.com/storage/showdoc.aspx?i=36...">http://www.anandtech.com/storage/showdoc.aspx?i=36... Reply
buzznut - Saturday, February 27, 2010 - linkThere are a lot of comments here, so I don't expect this to be read. I am going under the assumption that the data for the Kingston SSD-v 40GB will be the same for the Intel 40GB drive. Many of us have purchased the Intel 40GB as a boot drive. Unfortunately I rarely see it in any benchmarks.
I was wondering if there were any plans to do an article on raid performance. Also, are drive manufacturers planning on including trim support for raid at some point? Could we expect a firmware upgrade for this, or would it be for newer drives only?I understand that garbage collection is still available, but that's not the same is it?
I know that filling a drive to capacity is bad, but I have heard that one might leave anywhere from 10%-25% space available on a typical SSD. I have been paranoid about ruining the performance of my drive, so I have been running it at half capacity. Is there a sweet spot between capacity and performance on these smaller 40 GB drives?
Also would any of you recommend adding a second drive in raid 0? It seems to me to be an inexpensive way of adding capacity and performance without shelling out $200+ for a new higher capacity drive (which my wife will surely not approve). Again I am hesitant for the lack of trim support in raid. Will this require much more maintenance on the drive(s)? Reply
greenguy - Saturday, February 27, 2010 - linkAs another data point, I have 3 of these drives. I usually just read the kingston 40GB figure as it is the same drive. Performance degradation is something that increases as you read and write to the drive more. The less of this you do, the longer it will last in a near-virgin state.
But yeah, I am interested in the questions you ask as well. Reply
jimhsu - Saturday, February 27, 2010 - linkI'm curious about the unaligned vs aligned writes. How are these being set up: formatting NTFS with either 512 bytes or 4096 bytes allocation units? Or something else?
Also, being an owner of a X25-M G2, I see that earlier generation drives don't have much variation between the two, while these new generation drives have dramatic variation. How does this translate into real-life performance metrics (i.e. the anandtech bench test)?Are there situations where failing to take advantage of aligned 4K leads to a severe performance impact, compared to the new drives? Reply
semo - Saturday, February 27, 2010 - linkAny chance of seeing articles about PCI-E SSDs? Or are they not being talked about due to cost and/or lack of TRIM? Reply
lorteti - Saturday, February 27, 2010 - linkAnand,
How about the used drive performance?
I'm currently still unsing Vista, no plan upgrading to Win7 this year.
I think many are still using older OS.
Does these SSD's SandForce and C300 perform the same in used condition without TRIM?
jx Reply
shawkie - Saturday, February 27, 2010 - linkAnand, can you please include some discussion and/or benchmark on power consumption for those users with laptops? Reply
shawngmc - Saturday, February 27, 2010 - linkAnand,
Can you confirm whether or not this series of drives have Trim support? I had emailed OWC's tech support to try to find out, and they responded saying that their drives handle Trim internally.
I asked if I could get some details on this, but the technician did not have any. I can understand if they do automatic garbage collection, and I understand that the cycling is much lower due to the low 'write amplification' factor, but that's still not Trim support. You said that the Vertex LE supported Trim, and it's roughly the same drive, but I don't want to make an assumption I'll regret.
It's especially vexxing since OSX has no native Trim support, while I want to use this as a Windows 7 drive (as will many people after this review).
I've been waiting for SSD prices to drop, and while this isn't a drop inherently, 100GB that literally saturates SATA II for $400 is a very tempting spot to jump in.
Shawn Reply
ScavengerLX - Saturday, February 27, 2010 - linkDo you dream about SSDs, Anand? Reply
Paladin1211 - Saturday, February 27, 2010 - linkNormally you dont dream about your work, right? :D Reply
ScavengerLX - Saturday, February 27, 2010 - linkYes :-D Reply
iwodo - Friday, February 26, 2010 - link"6Gbps SATA will only improve large file read performance off of the drive. Loading apps and games shouldn't be any faster. Nearly all high performance SSDs load a single app/game in about the same time. "
So you are saying we are already reaching tipping point where SATA3 with 700MB/s Seq Read / Write wont give us any perceivable performance advantage? I did do any research or test, but surely Apps like Photoshop / Office / Games require to load more then few hundred MB right? Reply
Paladin1211 - Saturday, February 27, 2010 - linkI think the statement is pretty logical. Assume that you have 350MB/s sequential read and I have only 200MB/s. We both need to read a file of 20MB. Then it would take you 0.057 sec or take me 0.1 sec. Even a mouse click would take longer than the 0.043 sec difference :)
To load apps and games means to process a lot of small files, not one large file of multi hundred MB. This is where random read/write comes into play, negating most of the sequential advantages.
Conscript - Friday, February 26, 2010 - linkthanks for the review Anand, I've been looking up and down at these drives and was waiting for a reliable review. I am concerned that they won't let you open em up. Tell ya what, why don't you give them the $229, check to make sure there's nothing funny going on, and when you put it back together and check that it still works, I'll buy it off ya...and a used discount of course :) Reply
ssdreviewer - Friday, February 26, 2010 - linkwe would like to see more latency benchmark info in all SSD reviews, such as AS SSD benchmark, HDTune Pro access time etc. Reply
Anand Lal Shimpi - Saturday, February 27, 2010 - linkI present the inverse of average latency - IOPS :) Take 1/IOPS and you'll get average latency per IO. I figure it's easier to convey performance this way (bigger numbers mean better performance).
Take care,
Anand Reply
ssdreviewer - Saturday, February 27, 2010 - linkas the following posts already pointed out, that's not the case. it would be better you could present directly minimum/average/maximum latency data, rather than IOPS, which has no linear relations with latency under different QD. my applications rely more on latency than random r/w or IOPS, i.e. responsiveness is more crucial here. that being said, i would like to see more direct results from AS SSD and HDTune Pro access time tests. thanks. Reply
jimhsu - Saturday, February 27, 2010 - linkThat method can't give you information on maximum IO latency (which for me is the critical one, if you're concerned with gaming, real time video streaming, multimedia creation, etc). A drive with 0.1 ms latency but that peaks at 500 ms could be subjectively worse than one with 0.2 ms latency but that peaks at 100 ms. Reply
GullLars - Saturday, February 27, 2010 - linkActually, you need to take Queue Depth (QD) into account. This noted the formula is QD/IOPS, since IOPS = 1/([average accesstime]*[QD]) (this formula is known as Littles Law). If you test at QD=1, 1/IOPS = average accesstime, it's a special case. Since your IOPS tests are at QD 3 and IOPS is represented as bandwidth (IOPS*block size), you find average accesstime (at QD 3) in ms by the formula 3/([bandwidth in MB/s]/4(KB)) (not factoring in MB/KB means s->ms) = 12/[bandwidth in MB/s].
From my SSD project a month back, i found average accesstime increases as QD increases, and when QD=#channels average accesstime double when QD doubles. The reason for increased accesstime up to QD=#flash channels are (primarily) in two parts.
1. Statistical distribution says some channels will get multiple requests in queue while some go unused, therefore # of saturated channels < QD. The channels with queue will have single accesstime multiplied with queue lenght for average accesstime.
2. Controller NCQ overhead, the controller adds latency when administrating the queue. Reply
Paladin1211 - Friday, February 26, 2010 - linkI just look at the AnandTech Storage Bench charts, the Kingston V+ performs so good, going neck and neck with Intel and Indilinx MLC in Heavy Workload. How could it be that fast, Anand? Reply
Paladin1211 - Friday, February 26, 2010 - linkOps, I mean SLC, not MLC.
Too good to be true... Reply
Paladin1211 - Friday, February 26, 2010 - linkIn random write/read test, the V+ scores are so poor. Something is not right here. Reply
Anand Lal Shimpi - Saturday, February 27, 2010 - linkThe heavy workload is nearly half sequential. It's a heavy downloading and multitasking workload, which has thus far paved the way for a few unexpected strong performers. Remember that most controller makers actually optimize for sequential performance, which this benchmark tests more than any of the other tests. I still can't quite figure out why the Toshiba controller does so well here other than that it must really be tuned for this type of a workload. I've run and re-run the test, the results are always the same.
Take care,
Anand Reply
GullLars - Friday, February 26, 2010 - linkJust thought I'd add a link to a couple of graphs i made of IOPS scaling as a function of Queue Depth for 1-4 x25-V in RAID 0 from ICH10R compared to x25-M 80GB and 160GB, and 2 x25-M 80GB RAID 0. These are in the same price range, and the graphs will show why i think Anands reviews don't show the whole truth when there is no test beyond QD 8.
link: http://www.diskusjon.no/index.php?app=core&mod...">http://www.diskusjon.no/index.php?app=c...h_rel_mo...
The tests were done by 3 users at a forum i frequent, the username is in front of the setup that was benched.
The IOmeter config run was: 1GB testfile, 30 sec run, 2 sec ramp. Block sizes 0,5KB, 4KB, 16KB, 64KB. Queue Depths 1-128, 2^n stepping. This is a small part of a project from a month back mapping SSD and SSD RAID scaling by block size and queue depth (block sizes 0,5KB-64KB 2^n stepping, QD 1-128 2^n stepping).
ATTO is also nice to show scaling of sequential performance by block size (and possibly queue depth). Reply
cditty - Friday, February 26, 2010 - linkAnother great article. I have to give it to you, Anand. Your SSD coverage is by far the best on the net. I have learned so much from your various articles. Reply
Anand Lal Shimpi - Saturday, February 27, 2010 - linkThank you :) There wasn't much to this one, I haven't had the time unfortunately to put together another truly thorough investigation - there's just too much going on these days.
More SSD news next week!
Take care,
Anand Reply
GullLars - Friday, February 26, 2010 - linkWell, these are pretty good news for people who would rather RAID low capacity SSDs for higher performance at simelar cost to bigger drives.
RAIDing 2-3 of these 50GB SSDs from ICH10R would give above 600MB/s bandwidth for both read and write, and still be at an acceptable price.
I still can't over wishing for a test with RAID 0 of lowest capacity drives compared to the high-capacity drives always reviewed here to see how much more performance you can get for the same price.
At $230 this 50GB SF-1500 should be able to defend itself against 2 RAID-0 x25-V wich would cost about the same, but from benchmark numbers i've seen, 2R0 x25-V would beat it thoroughly at everything except tasks heavily focusing on sequential writing.
3 x25-V's comming in at about $300 would beat all drives listed in this lineup at almost all benchmarks, and at performance pr $ you can't beat it.
BTW, it would be nice include a screenshot of AS SSD benchmark, since it includes high QD testing of 4KB random IOPS so you can see what the drive is capable of at max load. AHCI/RAID specifies up to 32 outstanding IOs, and most SSDs with many channels support it fully and will scale up to QD 32. Intel x25-V/M/E wich are listed at about 60MB/s 4KB random read (QD 3) scale up to 120-160MB/s from QD 10-12, and the same is true for C300 and SF-1500. When testing 4KB random read at QD 3 on an NCQ enabled 10+ channel SSD, you are really saturating only 3 of the channels.
Indilinx Barefoot drives with 4 channels can do 4KB random reads at about 60MB/s at QD 5, but scale no further. Reply
Anand Lal Shimpi - Friday, February 26, 2010 - linkDon't worry, higher queue depth tests are coming :) You already see some of that in our Bench tests, but you'll see some iometer specific results soon.
TRIM still isn't supported under RAID, but I will be looking at lower capacity drives after this next round of reviews is done :)
Take care,
Anand Reply
GullLars - Friday, February 26, 2010 - linkI'm looking forward to it.
As for TRIM with RAID, if you use the RAID as you would a normal SSD, and don't have any usage patterns that does huge ammounts of random writes, you don't NEED the TRIM command, but it would be nice ofc. For a normal usage model, an SSD won't get write performance degraded to more than about 80% of fresh performance (+-10%), and since RAID gives linear scaling, two SSDs in RAID whitout TRIM will outperform a single SSD with TRIM quite nicely. Using this reasoning, TRIM not being avalible in RAID mode shouldn't stop you from buying and RAIDing 3-4 SSDs of 32/40GB rather than going for a single 80-256 since the RAID will outperform the single SSD by a good margin and at about the same price. The question is in the number of free ports on the motherboard SATA controller (for up to 4 SSDs). If you want to RAID more than 4 SSDs, you need a HBA or hardware RAID card to get further scaling.
In such a scenario, LSI 9211-8i + 8 x25-V will come in at $1000-1100 and deliver 1500MB/s read, 320-350MB/s write, and enough IOPS for any enthusiast. Reply
leexgx - Saturday, February 27, 2010 - linkBuy the SSD you need if its 128gb or 256gb buy one SSD enable AHCI and install windows7 and do not install chipset drivers or intel matrix drivers or update the AHCI drivers (keep an look out on windows update) the pc will be fast
SSD and RAID is pointless for home users or even gamers (only Pure Video editing or messing with Big files that needs 400-600MB/s maybe and you need 2 raid 0 SSD setups to even use the bandwidth if moving data between them)
still pointless as your looking at constant reads and Write speeds, 2 ssds will max out most RAID setups until the drive degrades (or one SSD fails) but thats not the point as the random access speeds and data rate random access of an SSD is high, then it been better to buy one ssd that fits your needs (Size 128gb been the min)
TRIM keeps Write latency down as an Write can be done mostly Right away where as no TRIM it has to perform an erase before Write
with SSDs the IOPS is norm +1000 an HDD, random IOPS and random access speeds are high as well an hdd can not match, SSD does not warrant an raid setup,
as an gamer and an owner of an first gen SSD (corsair S128) high data rate does not mean it be any faster (my SSD is slower then an HDD at constant read/writes but far faster random reads and IOPS) and i have gone from an RAID 0 2xWD black HDDs and before that 4x80gb hdds, if i had bit more money at the time i would of got an second gen SSD, but the S128 was very cheap and seem to work very well it does lack in Write access times and write speed an little but that only comes up when installing games, i can reboot my pc in under 1 min (thats desktop to desktop) and run any programs soon as my desktop loads the pc loads that fast i had to set my IP address to static IP as the DHCP obtain was taking to long to get an IP (chat programs would give up waiting and then retry)
(yes an faster SSD be better then what i have got system would most likely respond even faster as my SSD does lack NCQ and its an SATA150 drive and that be why my Write access times are not so good but its no JMicron drive it does not stall under Write loads) Reply
GullLars - Saturday, February 27, 2010 - linkThe point of RAIDing SSDs is not just bandwidth, it's increasing parallellity (if that's a word...) and avalible bandwidth for mixed read/write. Only powerusers or enthusiasts really should consider RAID, since the benefits like you say will not be very noticable in everyday singletasking usage. It's first when you start multitasking (or video editing like you mentioned) you really feel the difference.
If you have a quadcore running at 3-4Ghz and a good amount of fast RAM (say 8-12GB DDR3 1600) even a good SSDs can be a substantial bottleneck when multiple apps access storage at once, especially if you have a sequential write or read (or both) going on at the same time.
On my main rigg i have 2x Mtron Pro 7025 32GB (SLC) SSDs in RAID 0 that i bought in 2008 (cost me about $1400 at the time), and these don't support NCQ either. What's great about them is they don't get degraded performance at all, they have great accesstime (i get 90MB/s 4KB random read), and i've never experienced any freezing or hiccups. The 5 year warranty (even for use in enterprise servers) don't hurt either :P
When I upgrade next time, they will likely be replaced by intels 3. gen SSDs at the lowest capasity point (or simelar highest performing low capasity SSD) in RAID from an LSI 9211 (or simelar controller). If ioXtreme has dropped in price by then, maybe i'll buy that instead (or some simelar PCIe SSD). Reply
leexgx - Wednesday, March 03, 2010 - linki forgot to post before
if your Not doing Video editing or messing with Big files more then 1 SSD is pointless,
if your an gamer or want an fast pc one 1 SSD is only needed its been tested quite an number of times RAID + SSD is not needed any more More so that they have TRIM support now (that you lose when RAID is used)
multitasking really depends what you call multitasking i would norm call that 10-15 programs open at one time 1 SSD can handle that fine , again if it's Video editing you May gain the most from RAID, the Files would have to be very big thought as an SSD random access is fast any way (10-50MB/s) and so is its constant transfer rate that you see on most SSDs (200MB/s+)
Steam is the most likely the most stressful thing on my PC or any ones pc makes my SSD crawl when it decodes an pre loaded game (has to decryp all the files so that makes Lots of Read/Write) due to lack of NCQ on my corsair S128 very much so does not help, on second gen SSD thay have Sata300 so norm have NCQ support as default so the Slow downs norm do not happen, second and 3rd gen have TRIM support (3rd gen norm have it from when you Buy it like the JMicron 612)
when using RAID if Write back is Turned on you do benefit from buffered Writes so the (ICH8+) RAID gives more Priority to reads (as to why you get insane buffered burst rates on HDD or SSD when Write back is turned on) but there is an chance you can lose data if the system is powered down before data is Writen (unlicky for the most part under SSDs due to Write speeds and RAID norm Writes in Blocks not bits like windows does or p2p programs)
in the end if your an gamer or an user who just wants an fast and responsive pc 1 SSD is Far more then is needed you will not notice the speed improvement unless your doing benchmarks and only the Disk test part of the benchmarks (its also cheaper to Buy the 1 Big SSD with TRIM then 2 smaller SSD's in RAID and lose Trim, that would make 2 SSD's slower then 1 SSD once the drive runs out of free blocks due to lack of TRIM support) Reply
vol7ron - Friday, February 26, 2010 - linkI'm curious to see the aftermath of this SF-1500 business.
I know some people are using the 40-80GB versions of SSDs for ONLY their operating system, but I still feel like this product still isn't worth purchasing until you can get 120GB+ at the same prices as the 40-80GB range.
Basically, you should be able to have your OS/Office Suite/Games/Photo Editing software on the SSD. 40-80GB at this price is just not worth it.
I would also like to new RAID-0 tests, if possible. I don't know if you are waiting on the Intel Storage Matrix, or if all the problems have been fixed with RAID/Trim, but we're approaching a point where we can almost buy a bunch of the scrap 30/40GB SSDs. Because of the higher reliability, RAID-0 is looking very attractive.
Proposal: SATA-3 6Gb/s with 3 or 4 disks in RAID-0, w/ and w/o Trim turned on.
vol7ron Reply
greenguy - Saturday, February 27, 2010 - linkYour OS/Office Suite/Photo Editing software takes up nearly 40GB? I bet the rest is games. How many games do you need on your boot disk at once? Reply
vol7ron - Saturday, February 27, 2010 - linkIs there something wrong with my posts?
I say I want to see some RAID and 6Gbps testing and it gets ignored. An hour later, someone basically says the same thing and gets full response w/ follow-up. This has happened before, what's the deal? Reply
SeanFowler - Friday, February 26, 2010 - linkYou mention the performance that's lost on the 50GB platform, which is interesting.
As an SSD noob I wasn't aware that performance on smaller drives could be significantly slower than the performance on larger drives of the same series.
I had the 100GB LE on order, then cancelled it to order the C300 as I have Sata3, then found out that the 128GB C300 drive has mediocre write speeds (up to 140MB/s). Talk about a mess!
I see that you and most other sites tend to focus on the largest drives in a series, typically 256GB. Are these really the drives most of your readers are buying though? Based on your LE review and SSD round-up I went for the C300. I can't help thinking that your recommendations would have been very different had you instead tested the 128GB drives. Btw there's more info about the slow write speeds in my comment on the LE article, left earlier today.
I'm now in a bit of a quandry. Do I try to get an LE after all? Will it also have significantly poorer write performance than the 256GB version that everyone's reviewing? Help me Anand Kenobi; you're my only hope! Reply
greenguy - Saturday, February 27, 2010 - linkI bought 3 of the Intel x25-V 40GB drives recently - two for a workstation (mirrored boot drive), and one for my home system. I think that most people who run operating systems other than MS (e.g. Linux, BSD, OpenSolaris) would only really need around the 40-50GB mark. When I look at my Linux system that has been running over a year, the OS and apps part of the drive (i.e. that which benefits from an SSD), it doesn't come anywhere near the 40GB mark.
Everything else is media, and even Samsung's 5200RPM HDD is faster than these really need to be. 80MB/s and Bluray's max speed is 7MB/s. As a media drive, most of these will be used write once, read many, and for a read speed of 7MB/s, that's only 500rpm.
Only gamers are going to benefit from larger SSDs, and that's only if they can't be bothered in copying saved game files and settings to the storage drive after deleting whatever games they have gotten sick of. Or simply moving the directory to the storage drive and moving it back when done.
When prices come down again, you can buy more and raid them. This will give nearly double the speed for equivalent cost of buying say, an 80GB drive.
Really, $/GB is a pretty poor metric when evaluating these drives for use as a boot drive. Random 4k read speed/$ is probably the best, with one eye on the random writes (so long as the drive is bigger than say, $30GB).
Of course, this is not the case for laptop drives unless you can fit both a boot and a storage drive in them. Reply
Anand Lal Shimpi - Friday, February 26, 2010 - linkI usually try to review the sweetspot drive, Micron sent out only 256GB drives for review but normally I focus on the ~120GB drives. The LE I tested was a 100GB drive, so you can see where your performance would have been. I'll request a 128GB drive from Crucial right away :) Reply
SeanFowler - Friday, February 26, 2010 - linkThanks Anand; I was forgetting you'd reviewed the 100GB LE rather than the 200GB version. This is probably the one for me to go for then.
Another interesting subject is what impact read and write speeds have on the perceived performance of an OS drive. I would expect the read speed to be more important than the write speed as OS drives do more reads than writes.
This could mean that the extra 70MB/s read speed the C300 gives over the LE compensates for the 110MB/s deficit in write speeds.
I could cancel the C300 order and wait to see what's what in a week or so, but by that time the LE's will probably have sold out. The safest option right now seems to be the LE. Reply
Crypticone - Friday, February 26, 2010 - linkI too am not sure what drive to purchase right now. I would really like to see the performance of the C300 in SATA 6gig mode on the Storage Bench. Any chance of running this test? I am interested to see if the faster interface would improve apps and games loading, etc in the real world. Reply
Anand Lal Shimpi - Friday, February 26, 2010 - link6Gbps SATA will only improve large file read performance off of the drive. Loading apps and games shouldn't be any faster. Nearly all high performance SSDs load a single app/game in about the same time. Reply
vol7ron - Saturday, February 27, 2010 - linkThat might be true presently, but shouldn't that change as apps/games take advantage of more cores while loading and executing?
vol7ron Reply
pesos - Friday, February 26, 2010 - linkVery cool! Any plans to let the IT side guys take a crack at these in RAID configurations and let them lose on some database benchmarks? Reply
pesos - Friday, February 26, 2010 - linkI meant let them LOOSE of course - they probably wouldn't lose Reply
viewwin - Friday, February 26, 2010 - linkWhen will we hear more about the consumer level controller, SF-1200? Reply
Anand Lal Shimpi - Friday, February 26, 2010 - linkI suspect within a month :) Reply
fic2 - Friday, February 26, 2010 - linkMy calculator says that $229.99/50G = $4.5998 not $3.59. I think you divided by 64G instead of 50G. Reply
Anand Lal Shimpi - Friday, February 26, 2010 - linkI did divide by 64GB :) I wanted to show the total cost per GB of NAND you were paying for. It's still used, even if it's not being exposed to your OS. It's also why I said that the situation gets worse when you look at available user space.
Take care,
Annad Reply
iwodo - Friday, February 26, 2010 - linkThanks for clearing up. I think you should mention the drive have 64GB ( I dont think it is mentioned anywhere ) Reply
Anand Lal Shimpi - Saturday, February 27, 2010 - linkSecond paragraph after the last table on the front page, I mention that it has 64GB of MLC NAND :)
Take care,
Anand Reply
fic2 - Friday, February 26, 2010 - linkThat is what I figured, but I still think it is strange - it is advertised as a 50G SSD so that is what I think the $/G should be based on. Kind of like saying a car is a 5 wheel vehicle because you have an unused spare in the trunk. Reply
ratbert1 - Friday, February 26, 2010 - link...are there any reviews forthcoming on the Corsair Reactor or Nova drives? I heard the Reactors are out, don't know about the Nova. Reply
Mr Alpha - Friday, February 26, 2010 - linkCan I ask: what is the latest build of IOMeter? Reply
Anand Lal Shimpi - Friday, February 26, 2010 - link6-22-2008 build :) Reply
jimhsu - Sunday, February 28, 2010 - linkRight, you're using IOmeter. It shouldn't be hard to include maximum IO latency as a performance figure seeing as you already did so in the earlier SSD articles, i.e. http://www.anandtech.com/cpuchipsets/intel/showdoc...">http://www.anandtech.com/cpuchipsets/intel/showdoc... Reply
iwodo - Friday, February 26, 2010 - linkLOL, when i read it you makes it sounds like a new build is finally out. Reply
nerdtalker - Friday, February 26, 2010 - linkAwesome review Anand! Great read as always.
Strange that they wouldn't let you open the drive. I had always wondered whether particular vendors were more or less controlling about that kind of thing. Wonder if this one also has a supercap inside. Reply
Anand Lal Shimpi - Friday, February 26, 2010 - linkIt doesn't have a supercap and it's the same controller as the Vertex LE. I just got the distinct impression that they want this thing in a condition fit for resale (which is a bad idea imho).
Take care,
Anand Reply
Xtrafresh - Saturday, February 27, 2010 - linkmaybe they just want it in that condition so they can send the next reviewer the same sample as a representative of a purchhased drive?
Great review Anand, exciting stuff. Now if only the prices would start coming down a bit... Reply


text:
Angels of the Arctic
High on the Arctic Circle in the village of Tromso, Norway, a new community of Carmelite sisters have recently been accorded permission to open a con-vent. The local Catholic Bishop, concerned about the high rate of abortion in this area (the highest in Europe) has requested their presence to pray for life and to offer their spiritual support to the community. In a traditionally Protestant area, both Catholics and Protestants are now coming together to pray for this intention - and the results show that there seems to be an im-pact.
DVD Title: Angels of the ArcticDuration: 27 minutes
Share Your Faith With Others
This item can only be shipped within the United States.

subset: commoncrawl


text:
Democrats are proud to stand with veterans who have endured great sacrifice to keep our nation safe and protect our freedom. Under Democratic leadership, we have kept our promise to respect and care for our servicemen and women and will continue to respond to the needs of veterans and their families.
Democrats updated the G.I. Bill for post-9/11 veterans, and expanded employment opportunities by strengthening veterans' workforce programs and offering a tax credit to businesses that hire unemployed veterans. Democrats in Congress also improved health care access and treatment for returning Iraq and Afghanistan veterans by cutting red tape, modernizing VA hospitals, building VA outpatient clinics in communities where veterans live, and expanding the health services available under the VA.
Democrats have also increased the number of VA mental health providers and social workers to meet increased demand, and expanded mental health services. In addition, the Democratic Congress has improved housing and homelessness prevention services by updating VA programs, expanding eligibility for low-interest housing loans, and increasing support services.
Democrats are working with the Obama Administration to eliminate the VA disability claims backlog so that veterans can receive their benefits in a more timely manner and with fewer errors occurring. The Administration is also taking steps to help veterans, transitioning service members, and military spouses find employment, including recently launching the Veterans Employment Center, which provides a single location for veterans to look for well-paying jobs and utilize career resources and tools.
Democratic Whip Issue Reports
- 1 of 3
- ››
Democratic Whip Press
Related Videos
Hoyer Press Staff Blog Posts
From House Leadership & Committees
- 1 of 11
- ››
From Outside Groups
- 1 of 6
- ››


text:
|Information contained in this article was retrieved under the Creative Commons Attribution-ShareAlike 3.0 License.
The original article can be found on Narutopedia at Chakra Receiver.
Chakra Receiver
These cylindrical black rods allow the user to transmit their chakra across vast distances through an application of the Outer Path's ability. These rods act as high-frequency chakra demodulators, which become appreciably warm to the touch whilst currently receiving chakra.[1] They possess incredible durability, damaging every scalpel Shizune used to extract just a small sample during her autopsy of the first Animal Path,[2] and even displaying some resistance when struck by Rasengan.[3]
Nagato upon summoning the Demonic Statue of the Outer Path during his confrontation with Hanzō was pierced by several of these all of which originated from the navel of the statue.[4] From there, he incorporated their use in his Six Paths of Pain technique, where he implanted the receivers into a number of corpses at various points along their body, much like piercings. Doing so allowed him to transmit his chakra into the bodies and control them remotely as if they were his own, while bestowing each with certain abilities that Nagato wielded thanks to his Rinnegan. The many animals summoned through the Animal Path technique also had a number of these body piercings, suggesting that Nagato controlled them in a similar manner.[5] When using the Summoning: Demonic Statue of the Outer Path, several of these receivers were pierced into Nagato's back in order to allow him to transfer his chakra to the statue and in doing so, manipulate it.[6]
During the course of the Fourth Shinobi World War, Tobi utilised these same rods to control his own Six Paths of Pain comprised entirely from reincarnated jinchūriki, using only one receiver per body.[7] By using them to manifest chakra chains, he was able to maintain authority over even the tailed beasts sealed within the jinchūriki, while retaining a connection between the beasts and the Demonic Statue.[8]
It was later revealed that Madara, before dying imbued his will into one of these receivers and left it protruding from the navel of Hashirama's living clone and instructed Obito to use it for his revival.[9]
- Nagato has also used modified versions of these receivers to act as blades, allowing him to disrupt his opponents' chakra flow by transmitting his own chakra into their bodies when pierced. Obito employed them as stakes to bind the power of tailed beasts.
- The main difference between this and the Chakra Disruption Blades is that these begin transmitting chakra to his Six Paths of Pain when they are activated.[10] Nagato also seemingly went to some lengths to retrieve them.[11][12] The disruption blades on the other hand, are used in battle and only transmits chakra when Nagato wants.[13]
- It has been shown that the receivers inserted in the revived jinchūriki move position when they go through a transformation and get bigger. As seen with Rōshi as he transformed into Son Gokū's full form. It moved from the chest, up to its neck.[14]
- ↑ Naruto chapter 420, page 15
- ↑ Naruto chapter 418, page 14
- ↑ Naruto chapter 565, pages 12-13
- ↑ Naruto chapter 447, pages 8-9
- ↑ Naruto chapter 375, pages 8-12
- ↑ Naruto chapter 447, pages 8-10
- ↑ Naruto chapter 565, pages 10-11
- ↑ Naruto chapter 569, pages 2-7
- ↑ Naruto chapter 606, page 16
- ↑ Naruto chapter 516, page 15
- ↑ Naruto chapter 427, page 11
- ↑ Naruto chapter 425, page 13
- ↑ Naruto chapter 420, pages 8-9
- ↑ Naruto chapter 569, page 7


text:
You have no items in your shopping cart.
Fedex available. More info & Worldwide delivery
Click to shop
Availability: In stock
* Required Fields
Sherlina is the ultimate blogger babe, and her Nym denim boot is the hottest here at Ego. The Nym over the knee Denim boot features stiletto heel, Distressed denim upper and open toe for the sassiest boot that your shoedrobe needs. Wear yours for a edgy update with your LBD and oversized bomber.
Heel Height: 4.5"/11.43cm, Shoe Height (excluding heel): 24"/ 60.96cm
Material: Synthetic
We hope you love your EGO shoes as much as we do, but if for some reason you would like to return any items, that is not a prob! If you are a UK based customer, you will receive a returns label in your parcel so that you can send them back to us free of charge.
We accept returns 28 days after your purchase date, so you have plenty of time to decide. If you need any help at all, please contact customer services at email@example.com and one of our lovely team members will be happy to help! For more information please visit our returns policy.
If any style on the site has a different sizing we will clearly display this on the listing


text:
We're sorry, but we currently have no tickets available for this event.
Check out our full selection of Music Festivals tickets or sign up to be notified when tickets for this event are available.
Tribeca Film Festival Ticket Information
Nothing beats the excitement and variety of a Music Festival! Vivid Seats has cheap Tribeca Film Festival tickets everyday. View Tribeca Film Festival dates and performance times here. We have an extensive inventory of Tribeca Film Festival tickets and you can buy them online today. Dont miss out on this excitement. Fans who love a variety of musical acts love to see Music Festivals like Tribeca Film Festival. You will not be dissapointed so buy your Tribeca Film Festival event tickets today.
Review the following before purchasing our Tribeca Film Festival tickets:
- Vivid Seats is a ticket marketplace, all tickets are listed by independant 3rd party sellers.
- All Tribeca Film Festival ticket sales are final.
- We are only able to provide refunds (less the shipping costs) in the event that Tribeca Film Festival event is cancelled
- You will only have 30 days from the date of the event to request a refund of your Tribeca Film Festival tickets.
- Like all concert tickets please keep the Tribeca Film Festival tickets in a safe place because we are not responsible for lost or stolen tickets
- In addition to accepting all major credit card payments, we also accept Paypal
Related Concerts
- Aftershock Festival Tickets
- American Kickoff Tickets
- Austin City Limits Festival Tickets
- Burning Man Tickets
- Carolina Kickoff Tickets
- CMA Music Festival Tickets
- Coachella Music Festival Tickets
- Farm Aid Tickets
- Global Citizen Festival Tickets
- Great American Beer Festival Tickets


text:
For $200 they received 138 design concepts from 20 designers!
Over 40,000 of the world's best entrepreneurs and small businesses trust crowdSPRING with custom logo design, web design and writing services. 96% of them recommend that you try us too.Find out more
Creative's Disclosure Everything in my entry except the font is my original work. (?)
19-Feb-13 11:17 p.m. GMT


text:
Wildebeest creates the perfect present for new dog parents.16
Whoa! where'd that dog go??????
There's supposed to be a dog here, but it's no where to be found. This occurs when someone removes a dog after you started your dog stroll. Though on very rare occasions extremely shy dogs have been known to crawl right under the server and refuse to come out. If only we had a treat! Here doggie doggie doggie! Who wants a treat?
Copyright © I-5 Publishing, LLC. All rights reserved.


text:
This site uses cookies, by continuing to browse the site you are agreeing to our use of cookies...find out more
Talk to a Specialist
Kookaburra Verve 800 LH batting pads are Level 4 quality cricket pads featuring Light Weight Square HDF rods and Integral HDF Thigh Protection. Endorsed by England's Jos Buttler.
PRO Online Price
Saving £37.80
ORDER BY 5PM FOR NEXT DAY DELIVERY within the UK Mainland, options will be given in the basket.
As the World's Largest Online Cricket store, Pro:Direct Cricket offers competitive rates on Worldwide delivery to bring you the latest products from the biggest brands. Please select your destination from the table on the link below to see delivery options and costs.
If you find that your purchased product is unsuitable, simply return the item(s) in their original condition within 28 days of receipt for refund or exchange ( Some personalised items are excluded ). For further information please see our FAQ's or contact one of our team.
The critical measurement here is the approximate distance (sizes can vary slightly between brands) from the middle of the knee cap down to the instep - where the tongue of your shoe sit.
Please note that not all pads are available in every size shown
Copyright © 2005-2017 Pro:Direct. Designated trademarks and brands are the property of their respective owners. Use of this Web site constitutes acceptance of the Pro:Direct Privacy Policy.


text:
Sleeping Bag Reviews
Big Agnes Sleeping Giant14-Dec-2016
Sleeping under the stars is magical except for one thing: the ground. It's called terra "firma" because it's hard, and you don't have to be a princess for a pea/pinecone to give you fits all night....14-Dec-2016
Big Agnes Zirkel Sleeping Bag Review13-Nov-2013
Field test results for the Big Agnes Zirkel sleeping bag....13-Nov-2013
Brooks Range Elephant Foot Sleeping Bag Review13-Nov-2013
Field test report for the Brooks Range half bag, the Elephant Foot....13-Nov-2013
Feathered Friends Swallow Sleeping Bag Review13-Nov-2013
Field test results for the Feathered Friends Swallow sleeping bag....13-Nov-2013
Feathered Friends Vireo Sleeping Bag Review08-Dec-2010
The Vireo is built for climbers. Notably, this down bag has no zipper, is cut narrower and has more insulation about the legs than the chest. ...08-Dec-2010
Integral Designs Cocoon Sleeping Bag02-Feb-2010
The Cocoon is a Primaloft sleeping bag with a 30-inch, center zipper and a 30-degrees F rating....02-Feb-2010
Macpac Epic 300 SF Sleeping Bag07-Dec-2010
If you're jonesing to tick a big project in a single push, but you don't want to bring along a sleeping bag and bivy sack, then check out Macpac's new line of Epic sleeping bags—these lightweight down bags are also waterproof/breathable bivy sacks, giving climbers the opportunity to completely rethink how they pack for the mountains....07-Dec-2010
Marmot Helium Sleeping Bag Review13-Nov-2013
Field test results for the Marmot Helium sleeping bag....13-Nov-2013
Marmot Pounder Sleeping Bag Review08-Dec-2010
The only non-down bag tested, the Pounder has Primaloft insulation, the closest synthetic I've found for matching down's softness and drapability....08-Dec-2010
Montbell Super Stretch Down Hugger Sleeping Bag Review08-Dec-2010
This unique goose-down bag has elastic baffles that draw it around you like multiple down collars, reducing drafts. ...08-Dec-2010
Montbell Ultralight Spiral Down Hugger #1 Sleeping Bag Review13-Nov-2013
Field test report for the Montbell Ultralight Spiral Down Hugger #1 sleeping bag....13-Nov-2013
Mountain Hardwear Phantom Sleeping Bag Review08-Dec-2010
The Phantom 45D is a fully featured lightweight bag, the only model with a down baffle in the hood and neck, and a down-filled zipper draft tube....08-Dec-2010
Nemo Tuo Luxury Sleeping Pad and Fillo Pillow02-Feb-2010
As a much younger Bohemian, I used to sleep on the bare floor because I thought it would make me into a tough little climber....02-Feb-2010
Nunatak Arc Ghost Sleeping Bag Review08-Dec-2010
The Arc Ghost is a sophisticated, high-tech down comforter that tapers from head to toe and has a foot "pocket."...08-Dec-2010
Sierra Designs Wicked Light Sleeping Bag Review08-Dec-2010
SIERRA DESIGNSWICKED LIGHT | $180 | WEIGHT: 14 ouncesThis sewn-through bag, the lightest Sierra Designs has ever made, is the company's introduction t......08-Dec-2010
Valandre LaFayette Sleeping Bag Review12-Nov-2013
The Valandre LaFayette was the lightest-weight cold-weather bag we tested. ...12-Nov-2013
Valandre Mirage Sleeping Bag Review13-Nov-2013
Field test results for the Valandre Mirage sleeping bag....13-Nov-2013
Valandre Swing 70024-Jun-2010
Price | $368 www.valandre.com/us 4 starsDUCKS CAN'T GET a break. From birth we are taught that they are inferior to their rival, geese. There's the goos......24-Jun-2010
Valandré Thor Neo and Odin Neo16-Mar-2017
One of the many cruxes, literally, of winter mountaineering is getting a good night's sleep....16-Mar-2017
Western Mountaineering Highlite Sleeping Bag Review08-Dec-2010
WESTERN MOUNTAINEERINGHIGHLITE $220 WEIGHT: 16 ouncesThis was the first one-pound sleeping bag made, and is still one of the best. Sewn-through se......08-Dec-2010


text: NEW YORK ( TheStreet) -- If you put your home on the market, how long should you stick to your asking price before dropping it? Although some homes are snapped up as soon as they go on the market, occasionally going for more than the asking prices as buyers get into bidding wars, that's not usually the case. After years of lackluster sales and sinking home prices, today's sellers are wise to recognize they're not in the catbird seat. But conditions are definitely improving. Realtor.com, the website of the National Association of Realtors, says a decline in the number of homes for sale, coupled with low mortgage rates and growing consumer confidence, has reduced the amount of time the median home spends in the for-sale listings to 108 days in January, a 9.24% drop over the past year. Buyers are grabbing homes sooner because there are fewer to choose from. "In January, the total number of single-family homes, condos, townhomes and co-ops for sale in the U.S. decreased by 16.47% from one year ago, dropping to its lowest point since January 2007, when Realtor.com began collecting this data," the company says. "The significant year-over-year decline in homes for sale shows that the real estate market has worked through much of its excess inventory and, if these conditions continue, sellers are more likely to receive their asking price." All this news could cause some sellers to dig in their heels in hopes of getting top dollar, but they'd be wise to pause for a reality check. First of all, home prices remain far below their peaks of five or six years ago. Many homeowners who bought then are still underwater, owing their lenders more than their homes are worth. That's one reason the inventory of homes for sale is relatively small -- those homes can't go on the market unless the owners have cash for the difference between the debt and sale proceeds. A home put on the market at a price buyers perceive as too high is unlikely to sell no matter how long the seller waits. So sellers really need to pay attention to prices of recent comparable sales. Buyers do that and aren't likely to bid more than the going rate. Also, the seller who wants to "hold out" may not get the best service from the real estate agents, who don't want to waste time showing homes priced too high to sell. Since agents get paid only after a sale closes, they will direct buyers toward the homes most likely to sell, even if they are cheaper and will thus produce slightly lower commissions.


text:
Daisy Brown Chakra Rose Gold Chain Bracelet
Product code: CHKBR1020
Intuition. Perception. Imagination. Another fresh addition to the Chakra family, now made of Rose Gold plate the new Chakra Bracelet gives a sophisticated feel to your spiritual pieces of jewellery. The Daisy Rose Gold Brow Chakra bracelet, featuring an amethyst stone, is designed to serenely balance your Brow Chakra.
Delivery Information
- Royal Mail Tracked 24 delivery (1-3 working days) £2.95 or free on orders over £75
- Special Delivery (1-2 working days) £5.95 or free on orders over £200
- Please note all Special Delivery orders must be placed before 12PM in order to be received the next working day
- Shipping to all UK addresses
- Dispatched within 2 working days (sale and busy periods exempt)
- Exceptional circumstances and special orders are expected to take around 2-6 weeks
- We keep you informed of your orders progress every step of the way
Please visit our delivery and FAQ page for more information.
Your Guarantee
All products bought from us are guaranteed against defects in materials and workmanship for 12 months from the date of purchase unless stated otherwise by the brand/supplier. If within that period, after having opportunity to inspect a product and are satisfied (acting reasonably) that it is faulty as a result of a defect in materials or workmanship you may return the product to us for a replacement, exchange or refund of the price you paid for the product. You must provide us with the original invoice, despatch note or other proof of purchase.
About Hugh Rice
Hugh Rice the Jewellers was established in 1971 as a family-owned and run business. From humble beginnings as a basement workshop to a chain of thriving high-street jewellery stores, including our new St Stephens store which is the largest in the region, we now stock some of the biggest concessions of fashion and exclusive brand names. As a specialist in diamond jewellery, the Hugh Rice brand has been famous for its value and classic beauty. We offer a comprehensive in-house jewellery design service to all our customers and our diamond jewellery is handmade and assembled in our open viewing workshop.


text:
JP Fitness Forums
View Full Version:
JP Fitness Forums
Guidelines, Help & Forum Announcements
Forum Announcements, Forum Help, and Forum Guidelines
New to JP Fitness? Start Here!
Introduce Yourself
JPF Originals: Articles and Reviews
Training Discussion
Youth Athletic Development
Mahler's Monday Morning Motivator
Training Programs & Fitness FAQs
Fat Loss
Martial Arts Discussion
Injuries and Rehab
Personal Trainers & the Fitness Business
The New Rules of Lifting
The New Rules of Lifting Supercharged
The New Rules of Lifting for Life
The New Rules of Lifting for Abs
The New Rules of Lifting for Women
The New Rules of Lifting - The Original
Nutrition and Health
Diet, Nutrition and Supplementation
Healthy Recipes
TNT Recipes
General Health Discussion
Training Logs and Journals
The Fitness Photo Gallery
The Training Log
"Challenge" Training Logs
Everything Else
Sports Discussion
Movies, TV, Music, Books
Beer, Wine, Food
Off Topic
Current Events
Powered by vBulletin® Version 4.2.4 Beta 2 Copyright © 2017 vBulletin Solutions, Inc. All rights reserved.


text:
A fast web server demonstrating some undocumented Erlang features
From ErlangCentral Wiki
This HOWTO describes a web server written for the day when even Yaws is not quick enough.
The web server presented is quite simple. Even so it is split into 5 modules. Some of these are dictated by the OTP framework, and others are split out for convenience. The 5 modules are:
- iserve - API for managing URIs and callbacks
- iserve_app - OTP Application behaviour
- iserve_sup - OTP Supervisor
- iserve_server - Gen_server to own the listening socket and create connections
- iserve_socket - Process to handle a single HTTP connection for its lifetime
This HOWTO presents code and descriptions for each of these as they arise.
TCP Server Framework
A web server needs to support lots of connections, so at it's heart it needs to be a multiple connection TCP/IP server. There are any number of ways to arrange a set of erlang processes into such a thing. My favourite method is to have a single gen_server which opens and owns the listen socket (the listening process). This spawns another process which waits in accept until a connection attempt is received. At this time this accepting process sends a message back to the listening process and goes on to handle the traffic. This avoids the need for gen_tcp:controlling_process/2 and associated complexity.
On receipt of the message from the accepting process the listening process spawns a new accepting process and so on.
The listening process also traps exits, and if it receives a non normal exit from the current accepting process it creates a new one. In this way the listening process supervises its acceptor.
Common header file
The web server creates a #req{} record as it processes each request. This is used as part of the API into implementation callbacks and by the iserve_socket process. Here are the contents of iserve.hrl up front to get it out of the way:
% This record characterises the connection from the browser to our server % it is intended to be a consistent view derived from a bunch of different headers -record(req, {connection=keep_alive, % keep_alive | close content_length, % Integer vsn, % {Maj,Min} method, % 'GET'|'POST' uri, % Truncated URI /index.html args="", % Part of URI after ? headers, % [{Tag, Val}] body = <<>>}). % Content Body
Listening Process
Here is the code for the listening process. It is a very basic gen_server which models a single process:
-module(iserve_server). -behaviour(gen_server). -export([start_link/1, create/2]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -record(state, {listen_socket, port, acceptor}). %%-------------------------------------------------------------------- start_link(Port) when is_integer(Port) -> Name = list_to_atom(lists:flatten(io_lib:format("iserve_~w", [Port]))), gen_server:start_link({local, Name}, ?MODULE, Port, []). %% Send message to cause a new acceptor to be created create(ServerPid, Pid) -> gen_server:cast(ServerPid, {create, Pid}). %% Called by gen_server framework at process startup. Create listening socket init(Port) -> process_flag(trap_exit, true), case gen_tcp:listen(Port,[binary, {packet, http}, {reuseaddr, true}, {active, false}, {backlog, 30}]) of {ok, Listen_socket} -> %%Create first accepting process Pid = iserve_socket:start_link(self(), Listen_socket, Port), {ok, #state{listen_socket = Listen_socket, port = Port, acceptor = Pid}}; {error, Reason} -> {stop, Reason} end. handle_call(_Request, _From, State) -> Reply = ok, {reply, Reply, State}. %% Called by gen_server framework when the cast message from create/2 is received handle_cast({create, _Pid}, #state{listen_socket = Listen_socket} = State) -> New_pid = iserve_socket:start_link(self(), Listen_socket, State#state.port), {noreply, State#state{acceptor=New_pid}}; handle_cast(_Msg, State) -> {noreply, State}. handle_info({'EXIT', Pid, normal}, #state{acceptor=Pid} = State) -> {noreply, State}; %% The current acceptor has died, wait a little and try again handle_info({'EXIT', Pid, _Abnormal}, #state{acceptor=Pid} = State) -> timer:sleep(2000), iserve_socket:start_link(self(), State#state.listen_socket, State#state.port), {noreply, State}; handle_info(_Info, State) -> {noreply, State}. terminate(Reason, State) -> gen_tcp:close(State#state.listen_socket), ok. code_change(_OldVsn, State, _Extra) -> {ok, State}.
The notable thing about this code is the use of undocumented socket options to set up the initial state of connections made to the web server port.
- {backlog, 30} specifies the length of the OS accept queue.
- {packet, http} puts the socket into http mode. This makes the socket wait for a HTTP Request line, and if this is received to immediately switch to receiving HTTP header lines. The socket stays in header mode until the end of header marker is received (CR,NL,CR,NL), at which time it goes back to wait for a following HTTP Request line.
Acceptor/Socket process
It would be easy enough to create an abstraction of the Listen/Accept process structure and pass in the implementation function as another parameter. For this HOWTO however I'll stick with the most basic model - the acceptor process starts life as an acceptor and goes on to handle the traffic.
The acceptor process is implemented in a separate module iserve_socket. It is in two parts - the first part sets up a bunch of defines and exports and then does the accepting. Here is it is:
-module(iserve_socket). -export([start_link/3]). -export([init/1]). -include("iserve.hrl"). -define(not_implemented_501, "HTTP/1.1 501 Not Implemented\r\n\r\n"). -define(forbidden_403, "HTTP/1.1 403 Forbidden\r\n\r\n"). -define(not_found_404, "HTTP/1.1 404 Not Found\r\n\r\n"). -record(c, {sock, port, peer_addr, peer_port }). -define(server_idle_timeout, 30*1000). start_link(ListenPid, ListenSocket, ListenPort) -> proc_lib:spawn_link(?MODULE, init, [{ListenPid, ListenSocket, ListenPort}]). init({Listen_pid, Listen_socket, ListenPort}) -> case catch gen_tcp:accept(Listen_socket) of {ok, Socket} -> %% Send the cast message to the listener process to create a new acceptor iserve_server:create(Listen_pid, self()), {ok, {Addr, Port}} = inet:peername(Socket), C = #c{sock = Socket, port = ListenPort, peer_addr = Addr, peer_port = Port}, request(C, #req{}); %% Jump to state 'request' Else -> error_logger:error_report([{application, iserve}, "Accept failed error", io_lib:format("~p",[Else])]), exit({error, accept_failed}) end.
Note here that the process is started via the proc_lib:spawn_link/3 call. This wraps the normal spawn_link/3 bif so that the same nice error reports are created as for gen_servers, but it allows for a totally unstructured process implementation.
Web server state machine
The rest of this module contains the web server code. It is structured as a state machine which follows the state changes of the http socket mode. A single function models each state, and state transitions are simply implemented as a call to the function which owns the next state.
The states are:
- request - wait for a HTTP Request line. Transition to state headers if one is received.
- headers - collect HTTP headers. After the end of header marker transition to body state.
- body - collect the body of the HTTP request if there is one, and lookup and call the implementation callback. Depending on whether the request is persistent transition back to state request to await the next request or exit.
The code for the state request is below. A blocking call is made to gen_tcp:recv/3 with a timeout. The http driver waits for a CRNL terminated line of the form GET / HTTP/1.0. If anything else is received an http_error indication is returned with the erroneous data.
Some broken clients include extra CR or CRNL sequences so these are skipped.
request(C, Req) -> case gen_tcp:recv(C#c.sock, 0, 30000) of {ok, {http_request, Method, Path, Version}} -> headers(C, Req#req{vsn = Version, method = Method, uri = Path}, []); {error, {http_error, "\r\n"}} -> request(C, Req); {error, {http_error, "\n"}} -> request(C, Req); _Other -> exit(normal) end.
The code for the state headers is below. After sending the HTTP request line the http driver automatically switches into header receive mode. The driver looks for values of the form Header-Val: value and sends them one by one after each call to recv.
The driver maintains a hash table of well known header values and if one of those is received from the network it returns the header value as an atom. Otherwise the header value is returned as a string. In both cases the driver takes care of case insensitivity and automatically capitalises the first letter of each hyphen separated word in the header name. The author clearly got a little carried away at this point!
This web server extracts the values of the 'Content-Length' and 'Connection' headers for its own purposes and simply accumulates the other headers in a list to be passed to the application callback.
At the end of the headers the driver returns {ok, http_eoh}. This is the cue for the web server to skip to body mode. The driver automatically switches to wait for a new request line at this point unless a subsequent call to inet:setops/2 is made.
headers(C, Req, H) -> case gen_tcp:recv(C#c.sock, 0, ?server_idle_timeout) of {ok, {http_header, _, 'Content-Length', _, Val}} -> Len = list_to_integer(Val), headers(C, Req#req{content_length = Len}, [{'Content-Length', Len}|H]); {ok, {http_header, _, 'Connection', _, Val}} -> Keep_alive = keep_alive(Req#req.vsn, Val), headers(C, Req#req{connection = Keep_alive}, [{'Connection', Val}|H]); {ok, {http_header, _, Header, _, Val}} -> headers(C, Req, [{Header, Val}|H]); {error, {http_error, "\r\n"}} -> headers(C, Req, H); {error, {http_error, "\n"}} -> headers(C, Req, H); {ok, http_eoh} -> body(C, Req#req{headers = lists:reverse(H)}); _Other -> exit(normal) end. %% Shall we keep the connection alive? %% Default case for HTTP/1.1 is yes, default for HTTP/1.0 is no. %% Exercise for the reader - finish this so it does case insensitivity properly ! keep_alive({1,1}, "close") -> close; keep_alive({1,1}, "Close") -> close; keep_alive({1,1}, _) -> keep_alive; keep_alive({1,0}, "Keep-Alive") -> keep_alive; keep_alive({1,0}, _) -> close; keep_alive({0,9}, _) -> close; keep_alive(Vsn, KA) -> io:format("Got = ~p~n",[{Vsn, KA}]), close.
The code for the state body is below. At this point we have everything required except the body in the case of a POST request. If present this is retrieved in a single chunk based on the content length supplied. Most web servers will implement some sort of size limit for POST requests. This is still needed in our case to avoid a single client taking all the memory of the Erlang Virtual machine with the subsequent crash. It should be simple to add.
Unless the connection is a keep-alive type the process terminates at the end of processing this function. All resources are cleared up at process exit including open sockets so we do not need to be too careful about explicitly tidying up.
body(#c{sock = Sock} = C, Req) -> case Req#req.method of 'GET' -> Close = handle_get(C, Req), case Close of close -> gen_tcp:close(Sock); keep_alive -> inet:setopts(Sock, [{packet, http}]), request(C, #req{}) end; 'POST' when is_integer(Req#req.content_length) -> inet:setopts(Sock, [{packet, raw}]), case gen_tcp:recv(Sock, Req#req.content_length, 60000) of {ok, Bin} -> Close = handle_post(C, Req#req{body = Bin}), case Close of close -> gen_tcp:close(Sock); keep_alive -> inet:setopts(Sock, [{packet, http}]), request(C, #req{}) end; _Other -> exit(normal) end; _Other -> send(C, ?not_implemented_501), exit(normal) end.
The rest of the iserve_socket module is below. There is not much left to do. The inet driver has already worked out for us what sort of URI is being used.
The call_mfa/4 function relies on the existence of an ets/mnesia table which converts the URI into a module and function dynamic callback. This must have been created at installation (see section later).
handle_get(C, #req{connection = Conn} = Req) -> case Req#req.uri of {abs_path, Path} -> {F, Args} = split_at_q_mark(Path, []), call_mfa(F, Args, C, Req), Conn; {absoluteURI, http, _Host, _, Path} -> {F, Args} = split_at_q_mark(Path, []), call_mfa(F, Args, C, Req), Conn; {absoluteURI, _Other_method, _Host, _, _Path} -> send(C, ?not_implemented_501), close; {scheme, _Scheme, _RequestString} -> send(C, ?not_implemented_501), close; _ -> send(C, ?forbidden_403), close end. handle_post(C, #req{connection = Conn} = Req) -> case Req#req.uri of {abs_path, Path} -> call_mfa(Path, Req#req.body, C, Req), Conn; {absoluteURI, http, _Host, _, Path} -> call_mfa(Path, Req#req.body, C, Req), Conn; {absoluteURI, _Other_method, _Host, _, _Path} -> send(C, ?not_implemented_501), close; {scheme, _Scheme, _RequestString} -> send(C, ?not_implemented_501), close; _ -> send(C, ?forbidden_403), close end. call_mfa(F, A, C, Req) -> case iserve:lookup(C#c.port, Req#req.method, F) of {ok, Mod, Func} -> case catch Mod:Func(Req, A) of {'EXIT', Reason} -> io:format("Worker Crash = ~p~n",[Reason]), exit(normal); {200, Headers0, Body} -> Headers = add_content_length(Headers0, Body), Enc_headers = enc_headers(Headers), Resp = [<<"HTTP/1.1 200 OK\r\n">>, Enc_headers, <<"\r\n">>, Body], send(C, Resp) end; {error, not_found} -> send(C, ?not_found_404) end. add_content_length(Headers, Body) -> case lists:keysearch('Content-Length', 1, Headers) of {value, _} -> Headers; false -> [{'Content-Length', size(Body)}|Headers] end. enc_headers([{Tag, Val}|T]) when is_atom(Tag) -> [atom_to_list(Tag), ": ", enc_header_val(Val), "\r\n"|enc_headers(T)]; enc_headers([{Tag, Val}|T]) when is_list(Tag) -> [Tag, ": ", enc_header_val(Val), "\r\n"|enc_headers(T)]; enc_headers([]) -> []. enc_header_val(Val) when is_atom(Val) -> atom_to_list(Val); enc_header_val(Val) when is_integer(Val) -> integer_to_list(Val); enc_header_val(Val) -> Val. %% Split the path at the ?. This would have to do all sorts of %% horrible ../../ path checks and %C3 etc decoding if we wanted to %% retrieve actual paths to real filesystem files. As it is we only %% want to look it up as a key in mnesia/ets :) split_at_q_mark([$?|T], Acc) -> {lists:reverse(Acc), T}; split_at_q_mark([H|T], Acc) -> split_at_q_mark(T, [H|Acc]); split_at_q_mark([], Acc) -> {lists:reverse(Acc), []}. send(#c{sock = Sock}, Data) -> case gen_tcp:send(Sock, Data) of ok -> ok; _ -> exit(normal) end.
Setting up the web server
The Web server requires two preparation steps. The port number the web server listens on is defined in a file called iserve.conf which must be located in the priv subdirectory of the iserve application. It must contain a line of the form:
{port, 8081}.
If this file is not present then the port number defaults to 8080.
The web server also uses an mnesia table to manage mappings between URLs and implementation callbacks. This may be created and managed with the iserve.erl module:
-module(iserve). -export([create_table/1, add_callback/5, delete_callback/3, print_callbacks/0,lookup/3]). -record(iserve_callback, {key, % {Port, 'GET'|'POST', Abs_path} mf}). % {Mod, Func} create_table(Nodes) -> mnesia:create_table(iserve_callback, [{attributes, record_info(fields, iserve_callback)}, {disc_copies, Nodes}]). lookup(Port, Method, Path) -> case ets:lookup(iserve_callback, {Port, Method, Path}) of [#iserve_callback{mf = {Mod, Func}}] -> {ok, Mod, Func}; [] -> {error, not_found} end. add_callback(Port, Method, Path, Mod, Func) when ((Method == 'GET') or (Method == 'POST') and is_list(Path) and is_atom(Mod) and is_atom(Func) and is_integer(Port)) -> mnesia:dirty_write(iserve_callback, #iserve_callback{key = {Port, Method, Path}, mf = {Mod, Func}}). delete_callback(Port, Method, Path) -> mnesia:dirty_delete(iserve_callback, {Port, Method, Path}). print_callbacks() -> All = mnesia:dirty_match_object(#iserve_callback{_ = '_'}), io:format("Port\tMethod\tPath\tModule\tFunction~n"), lists:foreach(fun(#iserve_callback{key = {Port, Method, Path}, mf = {Module, Function}}) -> io:format("~p\t~p\t~p\t~p\t~p\r\n",[Port, Method, Path, Module, Function]) end, All).
iserve:create_table([node()]). must be called once at installation.
All Urls must be stored in this table with a module and function which will create the page. So for example the callback for the document root might be defined with:
iserve:add_callback(8081, 'GET', "/", test_iserve_app, do_get).
The callback for index.html could be:
iserve:add_callback(8081, 'GET', "/index.html", module, function2).
Building a web application
The simplest kind of iserve web application would be one to simply return a generated page. A function must be implemented which returns {200, Headers, Body} where Headers is a list of {Header-Atom, Val-String} and Body is a binary. For example:
-module(test_iserve_app). -export([do_get/2]). -include("iserve.hrl"). do_get(#req{} = Req, Args) -> {200, [], <<"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"> <html> <head> <title>Welcome to iserve</title> </head> <body> Hello </body> </html>">>}.
Obviously this is an extremely simple example. This is where you come in!
Supervisor and Application implementation
The web server only needs a little help to become a full blown OTP application. It needs an application behaviour, a supervisor behaviour, and a .app file.
These are presented below.
The Application:
-module(iserve_app). -behaviour(application). -export([ start/2, stop/1 ]). start(_Type, _StartArgs) -> case iserve_sup:start_link() of {ok, Pid} -> alarm_handler:clear_alarm({application_stopped, iserve}), {ok, Pid}; Error -> alarm_handler:set_alarm({{application_stopped, iserve}, []}), Error end. stop(_State) -> alarm_handler:set_alarm({{application_stopped, iserve}, []}), ok.
The Supervisor:
-module(iserve_sup). -behaviour(supervisor). -export([ start_link/0, init/1 ]). -define(SERVER, ?MODULE). start_link() -> supervisor:start_link({local, ?SERVER}, ?MODULE, []). init([]) -> Port = get_config(), Server = {iserve_server, {iserve_server, start_link, [Port]}, permanent, 2000, worker, [iserve_server]}, {ok, {{one_for_one, 10, 1}, [Server]}}. get_config() -> case file:consult(filename:join(code:priv_dir(iserve), "iserve.conf")) of [{port, Port}] -> Port; _ -> 8080 end.
The .app file.
A dependency on sasl is only included because of the calls to set and clear alarms in the application behaviour implementation:
{application, iserve, [{description, "Web Server"}, {vsn, "%ISERVE_VSN%"}, {modules, [ iserve_sup, iserve_app, iserve_server, iserve_socket ]}, {registered, [ iserve_sup]}, {applications, [kernel, stdlib, sasl]}, {mod, {iserve_app, []}}]}.
The code associated with this HOWTO is available under the BSD License
The undocumented features presented in this HOWTO are undocumented because they are not supported by Ericsson. On the other hand they are used in commercially shipping systems.