﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-前端工程师-Becket-随笔分类-网络/服务器</title><link>http://www.blogjava.net/ebecket/category/42446.html</link><description>一路风景我一路走着,不管多么疲惫,因为一路的风景很美.......
</description><language>zh-cn</language><lastBuildDate>Tue, 30 Mar 2010 23:56:59 GMT</lastBuildDate><pubDate>Tue, 30 Mar 2010 23:56:59 GMT</pubDate><ttl>60</ttl><item><title>设置MySQL的系统变量以调优性能</title><link>http://www.blogjava.net/ebecket/archive/2010/03/30/316954.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 30 Mar 2010 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/30/316954.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316954.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/30/316954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316954.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316954.html</trackback:ping><description><![CDATA[设置MySQL的系统变量以调优性能
<hr style="border-bottom: #eeeeee 1px solid; border-left: #eeeeee 1px solid; border-top: #eeeeee 1px solid; border-right: #eeeeee 1px solid" align="center" size="1" width="94%" />
<div>
<table style="width: 650px; table-layout: fixed" id="content" border="0" cellspacing="10" cellpadding="0" width="650">
    <tbody>
        <tr>
            <td>
            <div style="position: relative; word-wrap: break-word; font-size: 10pt; word-break: break-all">(1)、back_log：<br />
            求MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。<br />
            back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。<br />
            当你观察你的主机进程列表，发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时，就要加大 back_log 的值了。默认数值是50，我把它改为500。<br />
            <br />
            (2)、interactive_timeout：<br />
            服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800，我把它改为7200。<br />
            <br />
            (3)、key_buffer_size：<br />
            索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小，增加它可得到更好处理的索引(对所有读和多重写)，到你能负担得起那样多。如果你使它太大，系统将开始换页并且真的变慢了。默认数值是8388600(8M)，我的MySQL主机有2GB内存，所以我把它改为402649088(400MB)。<br />
            <br />
            (4)、max_connections：<br />
            允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加，否则，你将经常看到 Too many connections 错误。 默认数值是100，我把它改为1024 。<br />
            <br />
            (5)、record_buffer：<br />
            每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描，你可能想要增加该值。默认数值是131072(128K)，我把它改为16773120 (16M)<br />
            <br />
            (6)、sort_buffer：<br />
            每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M)，我把它改为 16777208 (16M)。<br />
            <br />
            (7)、table_cache：<br />
            为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64，我把它改为512。<br />
            <br />
            (8)、thread_cache_size：<br />
            可以复用的保存在中的线程的数量。如果有，新的线程从缓存中取得，当断开连接的时候如果有空间，客户的线置在缓存中。如果有很多新的线程，为了提高性能可以这个变量值。通过比较 Connections 和 Threads_created 状态的变量，可以看到这个变量的作用。我把它设置为 80。<br />
            <br />
            (10)、wait_timeout：<br />
            服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800，我把它改为7200。<br />
            <br />
            注：参数的调整可以通过修改 /etc/my.cnf 文件并重启 MySQL 实现。这是一个比较谨慎的工作，上面的结果也仅仅是我的一些看法，你可以根据你自己主机的硬件情况（特别是内存大小）进一步修改。<a class="hidden" href="http://xfgushi.blog.51cto.com/679315/157818">本文出自 51CTO.COM技术博客</a></div>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/ebecket/aggbug/316954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-30 17:01 <a href="http://www.blogjava.net/ebecket/archive/2010/03/30/316954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL服务器安装完之后如何调节性能 </title><link>http://www.blogjava.net/ebecket/archive/2010/03/30/316953.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 30 Mar 2010 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/30/316953.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316953.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/30/316953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316953.html</trackback:ping><description><![CDATA[MySQL服务器安装完之后如何调节性能
<hr style="border-bottom: #eeeeee 1px solid; border-left: #eeeeee 1px solid; border-top: #eeeeee 1px solid; border-right: #eeeeee 1px solid" align="center" size="1" width="94%" />
<div>
<table style="width: 650px; table-layout: fixed" id="content" border="0" cellspacing="10" cellpadding="0" width="650">
    <tbody>
        <tr>
            <td>
            <div style="position: relative; word-wrap: break-word; font-size: 10pt; word-break: break-all">译者：叶金荣（Email:），转载请注明译者和出处，并且不能用于商业用途，违者必究。<br />
            <br />
            My favorite question during Interview for people to work as MySQL DBAs or be involved with MySQL Performance in some way is to ask them what should be tuned in MySQL Server straight after installation, assuming it was installed with default settings.<br />
            在面试MySQL DBA或者那些打算做MySQL性能优化的人时，我最喜欢问题是：MySQL服务器按照默认设置安装完之后，应该做哪些方面的调节呢？<br />
            <br />
            I&#8217;m surprised how many people fail to provide any reasonable answer to this question, and how many servers are where in wild which are running with default settings.<br />
            <br />
            令我很惊讶的是，有多少人对这个问题无法给出合理的答案，又有多少服务器都运行在默认的设置下。<br />
            <br />
            Even though you can tune quite a lot of variables in MySQL Servers only few of them are really important for most common workload. After you get these settings right other changes will most commonly offer only incremental performance improvements.<br />
            <br />
            尽管你可以调节很多MySQL服务器上的变量，但是在大多数通常的工作负载下，只有少数几个才真正重要。如果你把这些变量设置正确了，那么修改其他变量最多只能对系统性能改善有一定提升。<br />
            <br />
            key_buffer_size - Very important if you use MyISAM tables. Set up to 30-40% of available memory if you use MyISAM tables exclusively. Right size depends on amount of indexes, data size and workload - remember MyISAM uses OS cache to cache the data so you need to leave memory for it as well, and data can be much larger than indexes in many cases. Check however if all of key_buffer is used over time - it is not rare to see key_buffer being set to 4G while combined size of .MYI files is just 1GB. This would be just a waste. If you use few MyISAM tables you&#8217;ll want to keep it lower but still at least 16-32Mb so it is large enough to accommodate indexes for temporary tables which are created on disk.<br />
            <br />
            key_buffer_size - 这对MyISAM表来说非常重要。如果只是使用MyISAM表，可以把它设置为可用内存的 30-40%。合理的值取决于索引大小、数据量以及负载 -- 记住，MyISAM表会使用操作系统的缓存来缓存数据，因此需要留出部分内存给它们，很多情况下数据比索引大多了。尽管如此，需要总是检查是否所有的 key_buffer 都被利用了 -- .MYI 文件只有 1GB，而 key_buffer 却设置为 4GB 的情况是非常少的。这么做太浪费了。如果你很少使用MyISAM表，那么也保留低于 16-32MB 的 key_buffer_size 以适应给予磁盘的临时表索引所需。<br />
            <br />
            innodb_buffer_pool_size This is very important variable to tune if you&#8217;re using Innodb tables. Innodb tables are much more sensitive to buffer size compared to MyISAM. MyISAM may work kind of OK with default key_buffer_size even with large data set but it will crawl with default innodb_buffer_pool_size. Also Innodb buffer pool caches both data and index pages so you do not need to leave space for OS cache so values up to 70-80% of memory often make sense for Innodb only installations. Same rules as for key_buffer apply - if you have small data set and it is not going to grow dramatically do not oversize innodb_buffer_pool_size you might find better use for memory available.<br />
            <br />
            innodb_buffer_pool_size - 这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的可以，然而Innodb在默认的 innodb_buffer_pool_size 设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来，无需留给操作系统太多的内存，因此如果只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。一些应用于 key_buffer 的规则有 -- 如果你的数据量不大，并且不会暴增，那么无需把 innodb_buffer_pool_size 设置的太大了。<br />
            <br />
            innodb_additional_pool_size This one does not really affect performance too much, at least on OS with decent memory allocators. Still you might want to have it 20MB (sometimes larger) so you can see how much memory Innodb allocates for misc needs.<br />
            <br />
            innodb_additional_pool_size - 这个选项对性能影响并不太多，至少在有差不多足够内存可分配的操作系统上是这样。不过如果你仍然想设置为 20MB(或者更大)，因此就需要看一下Innodb其他需要分配的内存有多少。<br />
            <br />
            innodb_log_file_size Very important for write intensive workloads especially for large data sets. Larger sizes offer better performance but increase recovery times so be careful. I normally use values 64M-512M depending on server size.<br />
            <br />
            innodb_log_file_size 在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相对越高，但是要注意到可能会增加恢复时间。我经常设置为 64-512MB，跟据服务器大小而异。<br />
            <br />
            innodb_log_buffer_size Default for this one is kind of OK for many workloads with medium write load and shorter transactions. If you have update activity spikes however or work with blobs a lot you might want to increase it. Do not set it too high however as it would be waste of memory - it is flushed every 1 sec anyway so you do not need space for more than 1 sec worth of updates. 8MB-16MB are typically enough. Smaller installations should use smaller values.<br />
            <br />
            innodb_log_buffer_size 默认的设置在中等强度写入负载以及较短事务的情况下，服务器性能还可以。如果存在更新操作峰值或者负载较大，就应该考虑加大它的值了。如果它的值设置太高了，可能会浪费内存 -- 它每秒都会刷新一次，因此无需设置超过1秒所需的内存空间。通常 8-16MB 就足够了。越小的系统它的值越小。<br />
            <br />
            innodb_flush_logs_at_trx_commit Crying about Innodb being 100 times slower than MyISAM ? You probably forgot to adjust this value. Default value of 1 will mean each update transaction commit (or each statement outside of transaction) will need to flush log to the disk which is rather expensive, especially if you do not have Battery backed up cache. Many applications, especially those moved from MyISAM tables are OK with value 2 which means do not flush log to the disk but only flush it to OS cache. The log is still flushed to the disk each second so you normally would not loose more than 1-2 sec worth of updates. Value 0 is a bit faster but is a bit less secure as you can lose transactions even in case MySQL Server crashes. Value 2 only cause data loss with full OS crash.<br />
            <br />
            innodb_flush_logs_at_trx_commit 是否为Innodb比MyISAM慢1000倍而头大？看来也许你忘了修改这个参数了。默认值是 1，这意味着每次提交的更新事务（或者每个事务之外的语句）都会刷新到磁盘中，而这相当耗费资源，尤其是没有电池备用缓存时。很多应用程序，尤其是从 MyISAM转变过来的那些，把它的值设置为 2 就可以了，也就是不把日志刷新到磁盘上，而只刷新到操作系统的缓存上。日志仍然会每秒刷新到磁盘中去，因此通常不会丢失每秒1-2次更新的消耗。如果设置为 0 就快很多了，不过也相对不安全了 -- MySQL服务器崩溃时就会丢失一些事务。设置为 2 指挥丢失刷新到操作系统缓存的那部分事务。<br />
            <br />
            table_cache - Opening tables can be expensive. For example MyISAM tables mark MYI header to mark table as currently in use. You do not want this to happen so frequently and it is typically best to size your cache so it is large enough to keep most of your tables open. It uses some OS resources and some memory but for modern hardware it is typically not the problem. 1024 is good value for applications with couple hundreds tables (remember each connection needs its own entry) if you have many connections or many tables increase it larger. I&#8217;ve seen values over 100.000 used.<br />
            <br />
            table_cache -- 打开一个表的开销可能很大。例如MyISAM把MYI文件头标志该表正在使用中。你肯定不希望这种操作太频繁，所以通常要加大缓存数量，使得足以最大限度地缓存打开的表。它需要用到操作系统的资源以及内存，对当前的硬件配置来说当然不是什么问题了。如果你有200多个表的话，那么设置为 1024 也许比较合适（每个线程都需要打开表），如果连接数比较大那么就加大它的值。我曾经见过设置为 100,000 的情况。<br />
            <br />
            thread_cache Thread creation/destructions can be expensive, which happen at each connect/disconnect. I normally set this value to at least 16. If application has large jumps in amount of concurrent connections and I see fast growth of<br />
            Threads_Created variable I boost it higher. The goal is not to have threads created in normal operation.<br />
            <br />
            thread_cache -- 线程的创建和销毁的开销可能很大，因为每个线程的连接/断开都需要。我通常至少设置为 16。如果应用程序中有大量的跳跃并发连接并且 Threads_Created 的值也比较大，那么我就会加大它的值。它的目的是在通常的操作中无需创建新线程。<br />
            <br />
            query_cache If your application is read intensive and you do not have application level caches this can be great help. Do not set it too large as it may slow things down as its maintenance may get expensive. Values from 32M to 512M normally make sense. Check it however after a while and see if it is well used. For certain workloads cache hit ratio is lower than would justify having it enabled. <br />
            <br />
            query_cache -- 如果你的应用程序有大量读，而且没有应用程序级别的缓存，那么这很有用。不要把它设置太大了，因为想要维护它也需要不少开销，这会导致MySQL变慢。通常设置为 32-512Mb。设置完之后最好是跟踪一段时间，查看是否运行良好。在一定的负载压力下，如果缓存命中率太低了，就启用它。<br />
            <br />
            Note: as you can see all of these are global variables. These variables depend on hardware and mix of storage engines, while per session variables are typically workload specific. If you have simple queries there is no reason to increase sort_buffer_size even if you have 64GB of memory to waste. Furthermore doing so may decrease performance.<br />
            I normally leave per session variable tuning to second step after I can analyze workload.<br />
            <br />
            注意：就像你看到的上面这些全局表量，它们都是依据硬件配置以及不同的存储引擎而不同，但是会话变量通常是根据不同的负载来设定的。如果你只有一些简单的查询，那么就无需增加 sort_buffer_size 的值了，尽管你有 64GB 的内存。搞不好也许会降低性能。<br />
            我通常在分析系统负载后才来设置会话变量。<br />
            <br />
            P.S Note MySQL distribution contains bunch of sample my.cnf files which may be great templates to use. Typically they would already be much better than defaults if you chose correct one. <br />
            <br />
            P.S，MySQL的发行版已经包含了各种 my.cnf 范例文件了，可以作为配置模板使用。通常这比你使用默认设置好的多了。</div>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/ebecket/aggbug/316953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-30 17:00 <a href="http://www.blogjava.net/ebecket/archive/2010/03/30/316953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> [集群]基础</title><link>http://www.blogjava.net/ebecket/archive/2010/03/30/316951.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 30 Mar 2010 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/30/316951.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316951.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/30/316951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316951.html</trackback:ping><description><![CDATA[&nbsp;[集群]基础
<hr style="border-bottom: #eeeeee 1px solid; border-left: #eeeeee 1px solid; border-top: #eeeeee 1px solid; border-right: #eeeeee 1px solid" align="center" size="1" width="94%" />
<div>
<table style="width: 650px; table-layout: fixed" id="content" border="0" cellspacing="10" cellpadding="0" width="650">
    <tbody>
        <tr>
            <td>
            <div style="position: relative; word-wrap: break-word; font-size: 10pt; word-break: break-all">
            <div class="content">
            <div>1.请简要什么是集群技术？为什么要使用集群技术？</div>
            <blockquote>
            <div>集群是一组协同工作的服务实体，用以提供比单一服务实体<strong>更具扩展性和可用性</strong>的服务平台。</div>
            </blockquote>
            <div>2.请说出你所知道的集群种类，和实现方案？</div>
            <blockquote>
            <div>目前Linux下的集群主要有三种类型&nbsp;</div>
            <div>1. HA (High Availability)&nbsp;</div>
            <div>2. LB (Load Balancing)&nbsp;</div>
            <div>3. HPC (High performance Computing)&nbsp;</div>
            <div>○ DC (Distributed Computing)&nbsp;</div>
            </blockquote>
            <blockquote>
            <div>○ PC (Parallel Computing)</div>
            </blockquote>
            <div></div>
            <div>高性能计算集群（High Performance Compute clustering）（如 Beowulf）使用多个机器来为需要大量计算能力的任务提供更强大的计算能力。RHEL没有内嵌这类集群的解决方案。&nbsp;</div>
            <div>高可用性集群（High-availability clustering）使用多个机器来为某个服务或某组服务提供额外的可靠性。&nbsp;</div>
            <div>负载均衡集群（Load-balance clustering）使用特殊的路由技术来给一组服务器分配任务。&nbsp;</div>
            <div>RedHat提供了后两种集群技术的解决方案。使用一组程序来监视该系统和集群中的服务的健康状况。</div>
            <div>虽然集群系统并不能解决所有的系统问题，但是它能够帮助系统管理员最大限度地利用现有的资源。并不是所有的程序都适用于集群系统，但是常见的系统应用如HTTP服务，FTP服务，数据库服务都可以利用集群系统来增强它们的功能。</div>
            <div>3.什么时候需要用LB集群？</div>
            <blockquote>
            <div>公共WEB服务、FTP服务、数据库服务等高负载服务中。</div>
            </blockquote>
            <div>4.什么时候需要使用HA集群？</div>
            <blockquote>
            <div>Ha集群主要用于文件服务，WEB服务，数据库服务等关键应用中</div>
            </blockquote>
            <div>5.Linux下实现LB集群的项目是？</div>
            <blockquote>
            <div>目前在LINUX系统下使用最为广泛的LB集群系统为LVS</div>
            </blockquote></div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/ebecket/aggbug/316951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-30 16:57 <a href="http://www.blogjava.net/ebecket/archive/2010/03/30/316951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL注入 相关</title><link>http://www.blogjava.net/ebecket/archive/2010/03/22/316111.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 22 Mar 2010 01:01:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/22/316111.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316111.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/22/316111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316111.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316111.html</trackback:ping><description><![CDATA[来自 千一网络<br />
<br />
<p>看了小竹的《SQL注入天书之ASP注入漏洞全接触》，感觉这篇文章写得非常好，由浅入深，实例详尽，对新手起到教学作用，对老手起到交流探讨作用，目前近40%的ASP网页均存在此漏洞，可以说《SQL注入天书之ASP注入漏洞全接触》也来得非常实用。</p>
<p>我是从其它网站上拷贝到&#8220;<a href="http://www.cftea.com/">千一网络</a>&#8221;的，我对其中的个别部分进行了修改，我想可能是别人在拷贝这篇文章时把其中的某些部分弄错了，在此向作者说明，其中修改的部分是去掉部分sql语句中的";"号，如：<br />
　　http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from sysobjects)&gt;0 <br />
　　修改为：<br />
http://www.mytest.com/showdetail.asp?id=49 and (select count(*) from sysobjects)&gt;0 </p>
<p><strong>SQL Server注入漏洞可能造成什么损失呢？<br />
　　</strong>轻：查看数据库名、SQL Server连接名、得到表的字段与记录等。<br />
　　重：备份数据库、下载数据库、在计算机内添加管理员等。</p>
<p>&#8220;查看数据库名、SQL Server连接名、得到表的字段与记录&#8221;之类的攻击，对于存在注入漏洞的网页一般都可实现。但若是使用Web管理网站，Web的密码又没加密，这样事态就变严重了。另外对于SELECT语句，如果没有控制好LockType（应设置为adLockReadOnly），也是很严重的。</p>
<p><strong>对于ASP＋SQL Server如何彻底防范注入漏洞：</strong><strong><br />
</strong>　　一、对进入sql语句的数字先进行类型转换<br />
　　二、对进入sql语句的字符，将单引号("'")替换为两个单引号("''")或其它</p>
<p>仅此两点即可，也许有人会问，那么文中第8页所说：<br />
</p>
<div class="code">在入门篇提到，有很多人喜欢用&#8217;号测试注入漏洞，所以也有很多人用过滤&#8217;号的方法来&#8220;防止&#8221;注入漏洞，这也许能挡住一些入门者的攻击，但对SQL注入比较熟悉的人，还是可以利用相关的函数，达到绕过程序限制的目的。</div>
　　是什么意思呢？既然说进行类型转换，过滤掉"'"就可以了，这里怎么又说可以绕过"'"的限制呢？其实，这里所说的是指对数字类型或我们注入添加的sql。也就是说：<br />
<p>对sql = "&#8230;&#8230;where id=" &amp; request.QueryString("id")<br />
　　用**.asp?id=char(50)，char会起到函数的作用</p>
<p>或者where xtype=char(85)（见文中第8页），char也会起到函数的作用。</p>
<p>但对于sql = "&#8230;&#8230;where key='"&nbsp;&amp;&nbsp;request.QueryString("key") &amp; "'"<br />
　　用**.asp?key=char(50)，这里的char(50)是不起作用的，为什么呢？<br />
　　套入sql一看，语句是这样的：<br />
　　sql = "&#8230;&#8230;where key='char(50)'"<br />
　　char(50)位于"'"内，变成了字符（串），所以就起不到函数的作用了。</p>
<p><strong>养成好的习惯，制定统一的规范<br />
　　</strong>上面的方法确实解决了注入漏洞问题，但并不表示其它地方可以马虎了，为什么要马虎了，为什么要让自己的网页千疮百孔，让几句代码去独挡一面呢？如果不养成好的习惯，团体之间如果不制定统一的规范，今天这个问题解决了，明天那个问题还会出现。</p>
<p>１、使用RecordSet记录集之前必须判断RecordSet的BOF或EOF属性。<br />
　　２、对于SELECT语句，除了不得已的情况，LockType必须设置为adLockReadOnly。<br />
　　３、放入数据库中的密码应该使用良好的加密算法进行加密，同时也禁止密码以明文的形式存在于页面文件中。<br />
　　４、在Web条件下，在非本机调试的情况下，不得使用sa连接数据库。<br />
　　５、对于需要用户权限的平台，必须将用户名和密码载入session，然后在需要的页面进行判断，不得使用if session("loginOK")&lt;&gt;"" then之类的语句来判断用户是否是合法用户。<br />
　　&#8230;&#8230;<br />
　　必要时，可以禁止IIS返回详细的出错信息，可以禁止public对sysobjects表的SELECT权限。<br />
　　&#8230;&#8230;</p>
<p>安全不是一方面的，仅靠几个规范几个好的习惯并不能保证能造就出安全的空间，1个False与99个True进行&#8220;与&#8221;运算，结果还是False，从中可以看出，哪怕只有一点错误，都可能导致结果全盘被否定。Web安全，除了注入漏洞，还有FTP设置错误、Web服务设置错误、后台程序漏洞这些最最基本的都可能导致服务器整个被人控制，所以处处都要三思啊。</p>
<br />
再次说明防注入不是替换关键字！<br />
<br />
<p>最近又看到很多关于 SQL 注入的帖子，都是使用替换 select、delete、update 等字符串的方法来防注入的。</p>
<p><span class="itemTitle">再说明一下，这种是错误的防注入方法，原因如下：</span></p>
<ol>
    <li>可能替换不全，不是所有的关键字都列入其中了的。
    <li>本身这种替换就有漏洞，比如 aandnd 本身没有问题，把其中的 and 替换掉后，反而冒出一个 and 出来。
    <li>这种替换方式还破坏了文字的原义，我曾经在某个网站上注册了 candy 这个用户名，后来该系统却告诉我没有这个用户，后来才知道 candy 中的 and 被去掉了。</li>
</ol>
<p><span class="itemTitle">正确的防注入方法是：</span></p>
<ul>
    <li>对数字类型进入 sql 前强制转换为数字。
    <li>对文本类型进入 sql 前替换单引号为双引号。
    <li>对日期类型进入 sql 前强制转换成日期，并替换单引号为双引号。</li>
</ul>
<p>这是从注入的原理来防的。</p>
<img src ="http://www.blogjava.net/ebecket/aggbug/316111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-22 09:01 <a href="http://www.blogjava.net/ebecket/archive/2010/03/22/316111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>服务器应用程序不可用 -IIS中浏览出现错误 的解决方法</title><link>http://www.blogjava.net/ebecket/archive/2010/03/19/315865.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Fri, 19 Mar 2010 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/19/315865.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/315865.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/19/315865.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/315865.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/315865.html</trackback:ping><description><![CDATA[&nbsp;今天下了个源码 ，结果在IIS中浏览出现错误：
<div style="text-indent: 2em">&nbsp;今天遇到这个问题尝试很多方法，最后看到这篇文章，解决了！！<br />
<wbr></div>
<div style="text-indent: 2em"><font style="font-size: 12px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> </font><font style="font-size: 14px"><font style="font-size: 14px">"<font color="#ff0000">服务器应用程序不可用</font>" 您试图在此 Web 服务器上访问的 Web 应用程序当前不可用。请点击 Web 浏览器中的&#8220;刷新&#8221;按钮重试您的请求。管理员注意事项:详述此特定请求失败原因的错误信息可在 Web 服务器的系统事件日志中找到。<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 到日志去一查，发现：&#8220;<font color="#ff0000">aspnet_wp.exe&nbsp;<wbr> (PID: 356)意外停止。</font>&#8221;&nbsp;<wbr>&#8220;由于 ASP.NET 进程标识对全局程序集缓存没有读权限，因此未能执行请求。错误: 0x80070005 拒绝访问。&#8221;</font></font></div>
<div><font style="text-indent: 2em" size="2"><br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <font style="font-size: 16px">到网上找了很长时间看了很多的相关资料，有说是微软补丁（KB886093）的问题，但是我的机器根本就没安这个补丁，有的说需要重新注册IIS，有的说需要配置machine.config但是我有的项目是也是浏览的，郁闷了好久，尝试了很多办法，觉得问题可能是出在IIS的权限设置，所以又重新将IIS的权限设置了一下,具体做法：</font></font></div>
<div><font style="font-size: 16px">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> IIS中左键单击需要运行的Web站点-&gt;所有任务-&gt;权限向导-&gt;继承所有安全性设置-&gt;完成.</font></div>
<div><font size="3">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 结果你猜怎么了，哈哈，涛声依旧啦！！！</font></div>
<img src ="http://www.blogjava.net/ebecket/aggbug/315865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-19 09:24 <a href="http://www.blogjava.net/ebecket/archive/2010/03/19/315865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搜索优化的问题</title><link>http://www.blogjava.net/ebecket/archive/2010/02/01/311564.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 01 Feb 2010 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/02/01/311564.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/311564.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/02/01/311564.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/311564.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/311564.html</trackback:ping><description><![CDATA[<p>关于搜索优化的问题：<br />
假设有个网站，有主页 in,主页的链接l1,l2,l3.<br />
目前这四个网页的搜索关键字都是："A B C",如下：<br />
&lt;meta name="keywords" content="A|B|C" /&gt; 都是一样的。<br />
目前百度搜索"A"，排名第一，搜索C，排名非常的靠后。</p>
<p>现在想让C也能在百度搜索里面靠前，所以打算这样：<br />
l2和l3页面分别改成这样：<br />
&lt;meta name="keywords" content="B|C|A" /&gt;<br />
&lt;meta name="keywords" content="C|A|B" /&gt;</p>
<p>这样的话，是不是就可以了？这样做，会不会影响了A的搜索排名？</p>
<img src ="http://www.blogjava.net/ebecket/aggbug/311564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-02-01 22:36 <a href="http://www.blogjava.net/ebecket/archive/2010/02/01/311564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>探寻IIS最大并发数 </title><link>http://www.blogjava.net/ebecket/archive/2010/01/20/310158.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 19 Jan 2010 17:27:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/20/310158.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310158.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/20/310158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310158.html</trackback:ping><description><![CDATA[<h1 class="postTitle"><a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/birdshover/archive/2009/08/16/1547025.html">探寻IIS最大并发数</a> </h1>
<div class="clear"></div>
<div class="postBody">
<p>测试系统Window 2003 Server ,IIS 6.0 ,ASP.Net 3.5 sp1<br />
Dual 1.8双核，2G内存，14G虚拟内存。</p>
<p>为了探寻IIS的最大并发数，先要做几个假设。</p>
<p>1、假设最大并发数就是当前的连接数。意思是当前能承受最大的连接，那么就表明最大的并发。<br />
2、假设IIS应用程序池处于默认状态，更改设置将会对最大连接数产生影响。</p>
<p>做完假设，现在做限制，设置站点保持HTTP连接，超时设置成0，就是不会超时。在站点请求的default.aspx页面设置线程Thread.Sleep(int.MaxValue)，接下来开发一个用来保持连接的小程序。</p>
<div class="cnblogs_code"><img style="display: none" id="Code_Closed_Image_033433" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_033433').style.display='none'; document.getElementById('Code_Open_Image_033433').style.display='inline'; document.getElementById('Code_Open_Text_033433').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"  alt="" /><img style="display: inline" id="Code_Open_Image_033433" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_033433').style.display='none'; getElementById('Code_Closed_Image_033433').style.display='inline'; getElementById('Code_Closed_Text_033433').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"  alt="" /><span style="display: none" id="Code_Closed_Text_033433" class="cnblogs_code_Collapse">Code</span><span style="display: inline" id="Code_Open_Text_033433"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Program&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">volatile</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;errorCount&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">volatile</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rightCount&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main(</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServicePointManager.DefaultConnectionLimit&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">10000</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;all&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">true</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;count</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateThread();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.Sleep(</span><span style="color: #800080">10</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(count&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">200</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #0000ff">string</span><span style="color: #000000">.Format(</span><span style="color: #800000">"</span><span style="color: #800000">sucess:{0};error:{1}</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;all&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;errorCount,&nbsp;errorCount));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(all&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1800</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadKey();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CreateThread()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;thread&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(ActiveRequest);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.IsBackground&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.Start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ActiveRequest()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestClient&nbsp;client&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;RequestClient(</span><span style="color: #800000">"</span><span style="color: #800000">http://192.168.18.2/default.aspx?d=</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;Guid.NewGuid());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.RequestProcess();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(client.IsError)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorCount</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #0000ff">string</span><span style="color: #000000">.Format(</span><span style="color: #800000">"</span><span style="color: #800000">错误消息:{0}</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;client.Messages));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rightCount</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Console.WriteLine(client.Messages);</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
</span><span style="color: #008000">/*</span><span style="color: #008000">*<br />
&nbsp;*&nbsp;author&nbsp;:&nbsp;yurow<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration: underline">http://birdshover.cnblogs.com</span><span style="color: #008000"><br />
&nbsp;*&nbsp;description:<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;history&nbsp;:&nbsp;created&nbsp;by&nbsp;yurow&nbsp;2009-8-16&nbsp;0:29:05&nbsp;<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Net;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.IO;<br />
<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;MaxLinked&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;RequestClient&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebRequest&nbsp;request;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebResponse&nbsp;response;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;RequestClient(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;url)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(HttpWebRequest)HttpWebRequest.Create(url);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.Timeout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">.MaxValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.KeepAlive&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorCode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddHeader(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;name,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;value)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.Headers.Add(name,&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;isError&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;StringBuilder&nbsp;buffer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuilder();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ErrorCode&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;IsError&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;isError;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;Messages&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;buffer.ToString();&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;RequestProcess()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.GetResponse();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(WebException&nbsp;ex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorCode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">)ex.Status;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.Append(ex.Message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isError&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(response&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream&nbsp;stream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamReader&nbsp;reader&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">stream&nbsp;=&nbsp;response.GetResponseStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">reader&nbsp;=&nbsp;new&nbsp;StreamReader(stream,&nbsp;Encoding.UTF8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">buffer.Append(reader.ReadToEnd());</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;ex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.Append(ex.Message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isError&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">if&nbsp;(reader&nbsp;!=&nbsp;null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;reader.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">if&nbsp;(stream&nbsp;!=&nbsp;null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;stream.Close();</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isError&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.Append(</span><span style="color: #800000">"</span><span style="color: #800000">建立连接失败！</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Close()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(response&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.Abort();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p>程序设置为只能启动1800个线程，这是由于.Net单进程最大线程数好像是2000个。因此，要测试最大并发数，要需要同时开几个测试进程。把系统虚拟内存调到最大值，线程过多会急剧占用内存。现在开始测试。</p>
<p>打开web站点的性能计数器，把显示比例调成1万。</p>
<p>发现到5000个连接时，IIS服务器崩溃（503错误），去洗了个澡，发现IIS服务器无法自己修复错误。又测试了几次，发现最大并发值是8200个，但是一般到5000左右就会崩溃，有时候甚至只有1000个。</p>
<p>按8200个计算，一个用户开一个浏览器浏览网页，可能会占用2～3个连接（参考《<a id="homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl00_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/birdshover/archive/2009/08/14/1546447.html"><span style="color: #6466b3">IIS连接数实验——Web开发必读</span></a> 》）,按两个计算，那么IIS默认情况下，最大并发数是4000个左右。</p>
<p>打开应用程序池配置，把最大工作进程数调高（默认为1），能有效提高最大连接数。我记得以前看过一篇文章，讲的是调到5左右比较合适。</p>
</div>
<img src ="http://www.blogjava.net/ebecket/aggbug/310158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-20 01:27 <a href="http://www.blogjava.net/ebecket/archive/2010/01/20/310158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>