Dustin,<br><br>Thanks for all the info!&nbsp; Do you think you could give me a small snippet of that mcsets file you generated?&nbsp; I&#39;ve only scanned over the protocol a bit, but I&#39;d like to do a few tests in my environment too.&nbsp; I didn&#39;t think I could use netcat directly on the server, that&#39;s pretty cool.&nbsp; :-)
<br><br>Thanks everyone!<br><br>--Cal<br><br><div><span class="gmail_quote">On 4/12/07, <b class="gmail_sendername">Dustin Sallings</b> &lt;<a href="mailto:dustin@spy.net">dustin@spy.net</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div style=""><br><div><span class="q"><div>On Apr 12, 2007, at 9:59 , Cal Heldenbrand wrote:</div><br></span><span class="q"><blockquote type="cite"><span style="border-collapse: separate; border-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">
1)&nbsp; is it better to have a large number of variables with small values, or a smaller amount of variables with larger values?&nbsp; I ran a test of 300,000 variables each 26 bytes in length.&nbsp; A set() loop for the whole test took around 20 seconds.&nbsp; 8 variables at around 1MB a piece took 
0.287 seconds.&nbsp; I realize that there might be some overhead during each iteration, but this is quite a time difference.&nbsp; (&nbsp; strlen() is called 2x for each iteration)&nbsp;&nbsp; The performance consideration here was to create one large value with comma separated ID strings, insert them to memcache, then pull them back and run a big split on the string.&nbsp; This would still require some client side processing time, but it would be nice from a programming perspective to be able to add 300,000 variables in a quick amount of time.
<span>&nbsp;</span><br><br>Is there some efficiency tweaking that I&#39;m missing on the memcached server?&nbsp; (Side tangent question -- is it possible to increase the max value length of 1MB?)<br></span></blockquote><div><br></div>
</span><div><span style="white-space: pre;">        </span>It&#39;s got to do with processing the results, I believe.&nbsp; I&#39;d consider this terminal velocity:</div><div><br></div><div>dustintmb:/tmp 503% nc -v -w 1 localhost 11211 &lt; mcsets &gt; /dev/null
</div><div>localhost [<a href="http://127.0.0.1" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">127.0.0.1</a>] 11211 (?) open</div><div>0.014u 0.085s 0:06.46 1.3%&nbsp; &nbsp; &nbsp; 0+0k 0+0io 0pf+0w</div><div><br>
</div><div><span style="white-space: pre;">        </span>For that, I generated a list of 300,000 in the form of &#39;k&#39; + i&nbsp; The -w 1 adds about a second to the end of the transaction, so I&#39;d say I loaded them in about five seconds.
</div><div><br></div><div><span style="white-space: pre;">        </span>Doing the same with my java API took me about 7 seconds to queue the sets, but another 26s before the last set actually made it into the server since I read and validate the results of each one individually.&nbsp; Note that the netcat case pipelines writes in and completely ignores store status (though I can check it with stats).
</div><span class="q"><br><blockquote type="cite"><span style="border-collapse: separate; border-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">
2)&nbsp;&nbsp; I&#39;m still trying to get into the mindset that memcache is to be used as a volatile cache, not a long term session storage space.&nbsp; Still, it&#39;s an attractive idea -- has anyone created a mirrored cache system?&nbsp; I was thinking, if I have 30 web machines with 2GB of spare memory a piece, I could run two memcached procs @ 1GB each, then create an API wrapper to write/read to the two separate clusters.&nbsp; The only consideration is the probability that the hashing algorithm might choose the two mirrored variables to store on one machine, killing the redundancy.&nbsp; This might be easier to implement in the daemon...&nbsp; or am I completely thinking down the wrong path on this one?&nbsp;&nbsp; Does the availability of cache data (hit/miss ratios) have a large effect on overall performance?
<span>&nbsp;</span><br></span></blockquote><div><br></div></span><div><span style="white-space: pre;">        </span>There are other tools out there more appropriate for long-term storage.&nbsp; It sounds like you may be wanting something more like a persistent DHT.&nbsp; As an interim, try treating it as a volatile caching backing a centralized store and see how often&nbsp; you really end up needing to hit the central point.
</div><span class="q"><br><blockquote type="cite"><span style="border-collapse: separate; border-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">
3)&nbsp; I don&#39;t know if this is the right place to ask this -- I&#39;m using libmemcache.&nbsp; The mc_set() prototype has a &#39;flags&#39; parameter, but everywhere I see it set to 0 with no documentation.&nbsp; Anyone know what these are for, and any documentation on this?
<span>&nbsp;</span><br></span></blockquote><div><br></div></span><div><span style="white-space: pre;">        </span>This is the best guide for that:</div><div><br></div><div><span style="white-space: pre;">        </span><a href="http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt</a></div><div><br></div><div><span style="white-space: pre;">        </span>Basically, flags mean whatever you want.&nbsp; I have a transcoder in my java API that uses the flags to remember what the value stored for a given key actually means.&nbsp; For example, I use half of the flags to tell me what type of an object I stored (integer, string, byte array, serialized java object, etc...) and the other half to set common flags like whether I gzipped the data in the transcoder (so it&#39;ll know to decompress it).
</div><span class="q"><br><blockquote type="cite"><span style="border-collapse: separate; border-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">
4)&nbsp; I&#39;ve been testing the event of the memcached servers being full.&nbsp; Initially I was thinking along the functionality of the -M parameter, to tell the client it&#39;s full and have some sort of contingency based on that... however I&#39;m thinking this is in the mentality of #2, trying to save data that shouldn&#39;t be saved.&nbsp; I did notice that given a short expiration time on variables, the -M option didn&#39;t seem to actually delete them, it kept giving out of memory errors on successive set operations.&nbsp; Is this a bug or normal behavior?&nbsp; In any event, I decided it&#39;s probably best to leave the daemon at default behavior to clean up after itself, so this is just more of a curiosity.
<span>&nbsp;</span><br></span></blockquote></span></div><div><br></div><div><span style="white-space: pre;">        </span>The value of -M is never clear to me.&nbsp; I have some data with which I need to do something.&nbsp; It may be processed already and sitting in my memcached cluster, or I may just have to do some preprocessing on it directly from the source (and store that in memcached).&nbsp; Having memcached stop working just because it&#39;s full seems like it would just cause me problems.
</div><br><div> <span style="border-collapse: separate; border-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">
<div>--&nbsp;</div><div>Dustin Sallings</div><br></span> </div><br></div></blockquote></div><br><br clear="all"><br>-- <br>Cal Heldenbrand<br>&nbsp;&nbsp; FBS Data Systems<br>&nbsp;&nbsp; E-mail:&nbsp;&nbsp;<a href="mailto:cal@fbsdata.com">cal@fbsdata.com</a>