apache 2.2,使用默認(rèn)配置,默認(rèn)最大連接數(shù)是150
1.首先在httpd.conf中加載httpd-mpm.conf配置(去掉前面的注釋):
# Server-pool management (MPM
specific)
Include conf/extra/httpd-mpm.conf
2.可見的MPM配置在/usr/local/apache/conf/extra/httpd-mpm.conf,但里面根據(jù)httpd的工作模式分了很多塊,哪一部才是當(dāng)前httpd的工作模式呢?可通過執(zhí)行
apachectl -l 來查看:
[root@zh888 extra]# /usr/local/apache/bin/apachectl
-l//因?yàn)椴捎渺o態(tài)編譯
Compiled in
modules:
core.c
mod_authn_file.c
mod_authn_default.c
mod_authz_host.c
mod_authz_groupfile.c
mod_authz_user.c
mod_authz_default.c
mod_auth_basic.c
mod_cache.c
mod_disk_cache.c
mod_mem_cache.c
mod_include.c
mod_filter.c
mod_deflate.c
mod_log_config.c
mod_env.c
mod_expires.c
mod_headers.c
mod_setenvif.c
mod_version.c
mod_proxy.c
mod_proxy_connect.c
mod_proxy_ftp.c
mod_proxy_http.c
mod_proxy_scgi.c
mod_proxy_ajp.c
mod_proxy_balancer.c
prefork.c//才用prefork所以在httpd-mpm.conf中找到mpm_prefork_module
http_core.c
mod_mime.c
mod_status.c
mod_autoindex.c
mod_asis.c
mod_cgi.c
mod_negotiation.c
mod_dir.c
mod_actions.c
mod_userdir.c
mod_alias.c
mod_rewrite.c
mod_so.c
所以修改連接數(shù)就在/usr/local/apache/conf/extra/httpd-mpm.conf這個(gè)文件了,打開它就找到prefork模式的默認(rèn)配置是:
StartServers
5
MinSpareServers 5
MaxSpareServers 10
MaxClients
150
MaxRequestsPerChild 0
prefork
控制進(jìn)程在最初建立“StartServers”個(gè)子進(jìn)程后,為了滿足MinSpareServers設(shè)置的需要?jiǎng)?chuàng)建一個(gè)進(jìn)程,等待一秒鐘,繼續(xù)創(chuàng)建兩個(gè),再等待一秒鐘,繼續(xù)創(chuàng)建四個(gè)……如此按指數(shù)級(jí)增加創(chuàng)建的進(jìn)程數(shù),最多達(dá)到每秒32個(gè),直到滿足MinSpareServers設(shè)置的值為止。
這種模式可以不必在請(qǐng)求到來時(shí)再產(chǎn)生新的進(jìn)程,從而減小了系統(tǒng)開銷以增加性能。MaxSpareServers設(shè)置了最大的空閑進(jìn)程數(shù),如果空閑進(jìn)程數(shù)大于這個(gè)值,Apache會(huì)自動(dòng)kill掉一些多余進(jìn)程。這個(gè)值不要設(shè)得過大,但如果設(shè)的值比MinSpareServers小,Apache會(huì)自動(dòng)把其調(diào)整為
MinSpareServers+1。如果站點(diǎn)負(fù)載較大,可考慮同時(shí)加大MinSpareServers和MaxSpareServers。
MaxRequestsPerChild設(shè)置的是每個(gè)子進(jìn)程可處理的請(qǐng)求數(shù)。每個(gè)子進(jìn)程在處理了“MaxRequestsPerChild”個(gè)請(qǐng)求后將自動(dòng)銷毀。0意味著無限,即子進(jìn)程永不銷毀。
雖然缺省設(shè)為0可以使每個(gè)子進(jìn)程處理更多的請(qǐng)求,但如果設(shè)成非零值也有兩點(diǎn)重要的好處:
1、可防止意外的內(nèi)存泄漏。
2、在服務(wù)器負(fù)載下降的時(shí)侯會(huì)自動(dòng)減少子進(jìn)程數(shù)。因此,可根據(jù)服務(wù)器的負(fù)載來調(diào)整這個(gè)值。MaxClients是這些指令中最為重要的一個(gè),設(shè)定的是
Apache可以同時(shí)處理的請(qǐng)求,是對(duì)Apache性能影響最大的參數(shù)。其缺省值150是遠(yuǎn)遠(yuǎn)不夠的,如果請(qǐng)求總數(shù)已達(dá)到這個(gè)值(可通過ps -ef|grep
httpd|wc
-l來確認(rèn)),那么后面的請(qǐng)求就要排隊(duì),直到某個(gè)已處理請(qǐng)求完畢。這就是系統(tǒng)資源還剩下很多而HTTP訪問卻很慢的主要原因。雖然理論上這個(gè)值越大,可以處理的請(qǐng)求就越多,但Apache默認(rèn)的限制不能大于256。ServerLimit指令無須重編譯Apache就可以加大MaxClients。
注意,雖然通過設(shè)置ServerLimit,我們可以把MaxClients加得很大,但是往往會(huì)適得其反,系統(tǒng)耗光所有內(nèi)存。以我手頭的一臺(tái)服務(wù)器為例:內(nèi)存2G,每個(gè)apache進(jìn)程消耗大約0.5%(可通過ps
aux來確認(rèn))的內(nèi)存,也就是10M,這樣,理論上這臺(tái)服務(wù)器最多跑200個(gè)apache進(jìn)程就會(huì)耗光系統(tǒng)所有內(nèi)存,所以,設(shè)置MaxClients要慎重。
3.要加到多少?
連接數(shù)理論上當(dāng)然是支持越大越好,但要在服務(wù)器的能力范圍內(nèi),這跟服務(wù)器的CPU、內(nèi)存、帶寬等都有關(guān)系。
查看當(dāng)前的連接數(shù)可以用:
ps aux | grep httpd | wc -l
計(jì)算httpd占用內(nèi)存的平均數(shù):
ps
aux|grep -v grep|awk '/httpd/{sum+=$6;n++};'
由于基本都是靜態(tài)頁面,CPU消耗很低,每進(jìn)程占用內(nèi)存也不算多,大約200K。
假如服務(wù)器內(nèi)存有2G,除去常規(guī)啟動(dòng)的服務(wù)大約需要500M(保守估計(jì)),還剩1.5G可用,那么理論上可以支持1.5*1024*1024*1024/
= 8053.
約8K個(gè)進(jìn)程,支持2W人同時(shí)訪問應(yīng)該是沒有問題的(能保證其中8K的人訪問很快,其他的可能需要等待1、2秒才能連上,而一旦連上就會(huì)很流暢)
控制最大連接數(shù)的MaxClients ,因此可以嘗試配置為:
StartServers 5
MinSpareServers
5
MaxSpareServers 10
ServerLimit 5500
MaxClients
5000
MaxRequestsPerChild 100
注意,MaxClients默認(rèn)最大為250,若要超過這個(gè)值就要顯式設(shè)置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重啟httpd時(shí)會(huì)有提示。
重啟httpd后,通過反復(fù)執(zhí)行pgrep httpd|wc -l
來觀察連接數(shù),可以看到連接數(shù)在達(dá)到MaxClients的設(shè)值后不再增加,但此時(shí)訪問網(wǎng)站也很流暢,那就不用貪心再設(shè)置更高的值了,不然以后如果網(wǎng)站訪問突增不小心就會(huì)耗光服務(wù)器內(nèi)存,可根據(jù)以后訪問壓力趨勢(shì)及內(nèi)存的占用變化再逐漸調(diào)整,直到找到一個(gè)最優(yōu)的設(shè)置值。
(MaxRequestsPerChild不能設(shè)置為0,可能會(huì)因內(nèi)存泄露導(dǎo)致服務(wù)器崩潰)
更佳最大值計(jì)算的公式:
apache_max_process_with_good_perfermance < (total_hardware_memory /
apache_memory_per_process ) * 2
apache_max_process =
apache_max_process_with_good_perfermance * 1.5
4.用/usr/local/apache/bin/ab來測(cè)試壓力不過還有一個(gè)工具叫webbench也可以測(cè)試。
[root@zh888 bin]# /usr/local/apache/bin/ab -n 100 -c
100http://192.168.100.1:8000/index.php//參數(shù)很多一般我們用 -c 和 -n
參數(shù)就可以了這個(gè)表示同時(shí)處理100個(gè)請(qǐng)求并運(yùn)行100次index.php文件.
This is ApacheBench Version 2.3
Copyright 1996 Adam Twiss Zeus Technology
Ltd
Licensed to The Apache Software Foundation
Benchmarking 192.168.100.1 (be patient).....done
Server Software: Apache/2.2.19//平臺(tái)apache 版本2.0.54
Server Hostname: 192.168.100.1//服務(wù)器主機(jī)名
Server Port: 8000//端口
Document Path: /index.php//測(cè)試的頁面文檔
Document Length: bytes//文檔大小
Concurrency Level: 100//并發(fā)數(shù)
Time taken for tests: 4.482 seconds//整個(gè)測(cè)試持續(xù)的時(shí)間
Complete requests: 100//完成的請(qǐng)求數(shù)量
Failed requests: 0//失敗的請(qǐng)求數(shù)量
Write errors: 0
Total transferred: bytes//整個(gè)場(chǎng)景中的網(wǎng)絡(luò)傳輸量
HTML transferred: bytes
Requests per second: 22.31 [#/sec]
(mean)//大家最關(guān)心的指標(biāo)之一,相當(dāng)于 LR 中的 每秒事務(wù)數(shù) ,后面括號(hào)中的 mean 表示這是一個(gè)平均值
Time per request: 4481.929 [ms] (mean)//大家最關(guān)心的指標(biāo)之二,相當(dāng)于 LR 中的 平均事務(wù)響應(yīng)時(shí)間 ,后面括號(hào)中的
mean 表示這是一個(gè)平均值
Time per request: 44.819 [ms] (mean across all concurrent
requests)//每個(gè)請(qǐng)求實(shí)際運(yùn)行時(shí)間的平均值
Transfer rate: 793.68 [Kbytes/sec]
received//平均每秒網(wǎng)絡(luò)上的流量,可以幫助排除是否存在網(wǎng)絡(luò)流量過大導(dǎo)致響應(yīng)時(shí)間延長的問題
Connection Times (ms)//網(wǎng)絡(luò)上消耗的時(shí)間的分解。
min mean[+/-sd] median max
Connect: 0 73 24.5 79 96
Processing: 252
2542 1291.7 2590 4386
Waiting: 252 2541 1292.5 2590 4384
Total: 253 2615
1311.0 2671 4482
Percentage of the requests served within a certain time
(ms)//整個(gè)場(chǎng)景中所有請(qǐng)求的響應(yīng)情況。在場(chǎng)景中每個(gè)請(qǐng)求都有一個(gè)響應(yīng)時(shí)間,其中50%的用戶響應(yīng)時(shí)間小于1093 毫秒,60% 的用戶響應(yīng)時(shí)間小于1247
毫秒,最大的響應(yīng)時(shí)間小于7785
毫秒
由于對(duì)于并發(fā)請(qǐng)求,cpu實(shí)際上并不是同時(shí)處理的,而是按照每個(gè)請(qǐng)求獲得的時(shí)間片逐個(gè)輪轉(zhuǎn)處理的,所以基本上第一個(gè)Time per
request時(shí)間約等于第二個(gè)Time per request時(shí)間乘以并發(fā)請(qǐng)求數(shù)
50% 2671
66% 3351
75% 3923
80% 4095
90% 4358
95%
4441
98% 4472
99% 4482
100% 4482 (longest request)
4.是在使用Apache2.2的ab進(jìn)行測(cè)試時(shí)遇到的問題:
使用ab測(cè)試的時(shí)候當(dāng)-c并發(fā)數(shù)超過1024就會(huì)出錯(cuò):
windows下提示:apr_pollset_create
failed: Invalid argument (22)
linux下提示:socket: Too
many open files (24)
解決辦法:
linux下:ulimit -n
(設(shè)置系統(tǒng)允許同時(shí)打開的文件數(shù),系統(tǒng)默認(rèn)是1024),可以用ulimit -a查看open files項(xiàng),# lsof |wc -l
可以查看系統(tǒng)所有進(jìn)程的文件打開數(shù)。
ulimit:顯示(或設(shè)置)用戶可以使用的資源限制
ulimit -a 顯示用戶可以使用的資源限制
ulimit unlimited
不限制用戶可以使用的資源,但本設(shè)置對(duì)可打開的最大文件數(shù)(max open files)
和可同時(shí)運(yùn)行的最大進(jìn)程數(shù)(max user
processes)無效
ulimit -n 設(shè)置用戶可以同時(shí)打開的最大文件數(shù)(max open files)
例如:ulimit -n 8192
如果本參數(shù)設(shè)置過小,對(duì)于并發(fā)訪問量大的網(wǎng)站,可能會(huì)出現(xiàn)too many open files的錯(cuò)誤
ulimit -u
設(shè)置用戶可以同時(shí)運(yùn)行的最大進(jìn)程數(shù)(max user processes)
例如:ulimit -u 1024
5最后補(bǔ)充一下apache的知識(shí):
簡(jiǎn)介
Apache
HTTP服務(wù)器被設(shè)計(jì)為一個(gè)強(qiáng)大的、靈活的能夠在多種平臺(tái)以及不同環(huán)境下工作的服務(wù)器。不同的平臺(tái)和不同的環(huán)境經(jīng)常產(chǎn)生不同的需求,或是為了達(dá)到同樣的最佳效果而采用不同的方法。Apache憑借它的模塊化設(shè)計(jì)很好的適應(yīng)了大量不同的環(huán)境。這一設(shè)計(jì)使得網(wǎng)站管理員能夠在編譯時(shí)和運(yùn)行時(shí)憑借載入不同的模塊來決定服務(wù)器的不同附加功能。
Apache2.0將這種模塊化的設(shè)計(jì)延伸到了web服務(wù)器的基礎(chǔ)功能上。這個(gè)版本帶有多路處理模塊(MPM)的選擇以處理網(wǎng)絡(luò)端口綁定、接受請(qǐng)求并指派鐘進(jìn)程來處理這些請(qǐng)求。
將模塊化設(shè)計(jì)延伸到這一層次主要有以下兩大好處:
*
Apache可以更簡(jiǎn)潔、更有效地支持各種操作系統(tǒng)。尤其是在mpm_winnt中使用本地網(wǎng)絡(luò)特性代替Apache1.3中使用的POSIX模擬層后,Windows版本的Apache現(xiàn)在具有更好的性能。這個(gè)優(yōu)勢(shì)借助特定的MPM同樣延伸到了其他各種操作系統(tǒng)。
*
服務(wù)器可以為某些特定的站點(diǎn)進(jìn)行定制。比如,需要更好伸縮性的站點(diǎn)可以選擇象worker或event這樣線程化的MPM,而需要更好的穩(wěn)定性和兼容性以適應(yīng)一些舊的軟件的站點(diǎn)可以用prefork
。
從用戶角度來看,MPM更像其他的Apache模塊。主要的不同在于:不論何時(shí),必須有且僅有一個(gè)MPM被載入到服務(wù)器中。現(xiàn)有的MPM列表可以在模塊索引中找到。
選擇一個(gè)MPM
MPM必須在編譯配置時(shí)進(jìn)行選擇,并靜態(tài)編譯到服務(wù)器中。如果編譯器能夠確定線程功能被啟用,它將會(huì)負(fù)責(zé)優(yōu)化大量功能。因?yàn)橐恍㎝PM在Unix上使用了線程,而另外一些沒有使用,所以如果在編譯配置時(shí)選擇MPM并靜態(tài)編譯進(jìn)Apache,Apache將會(huì)有更好的表現(xiàn)。
你可以在使用configure腳本時(shí)用 --with-mpm=NAME 選項(xiàng)指定MPM,NAME就是你想使用的MPM的名稱。
一旦服務(wù)器編譯完成,就可以用 ./httpd -l
命令來查看使用了哪個(gè)MPM。這個(gè)命令將列出所有已經(jīng)被編譯到服務(wù)器中的模塊,包括MPM。
我們主要闡述prefork和worker這兩種和性能關(guān)系最大的產(chǎn)品級(jí)MPM。
Apache MPM prefork
一個(gè)非線程型的、預(yù)派生的MPM
概述
這個(gè)多路處理模塊(MPM)實(shí)現(xiàn)了一個(gè)非線程型的、預(yù)派生的web服務(wù)器,它的工作方式類似于Apache
1.3。它適合于沒有線程安全庫,需要避免線程兼容性問題的系統(tǒng)。它是要求將每個(gè)請(qǐng)求相互獨(dú)立的情況下最好的MPM,這樣若一個(gè)請(qǐng)求出現(xiàn)問題就不會(huì)影響到其他請(qǐng)求。
這個(gè)MPM具有很強(qiáng)的自我調(diào)節(jié)能力,只需要很少的配置指令調(diào)整。最重要的是將MaxClients設(shè)置為一個(gè)足夠大的數(shù)值以處理潛在的請(qǐng)求高峰,同時(shí)又不能太大,以致需要使用的內(nèi)存超出物理內(nèi)存的大小。
工作方式
一個(gè)單獨(dú)的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)產(chǎn)生子進(jìn)程,這些子進(jìn)程用于監(jiān)聽請(qǐng)求并作出應(yīng)答。Apache總是試圖保持一些備用的(spare)或者是空閑的子進(jìn)程用于迎接即將到來的請(qǐng)求。這樣客戶端就不需要在得到服務(wù)前等候子進(jìn)程的產(chǎn)生。
StartServers MinSpareServers MaxSpareServers
MaxClients指令用于調(diào)節(jié)父進(jìn)程如何產(chǎn)生子進(jìn)程。通常情況下Apache具有很強(qiáng)的自我調(diào)節(jié)能力,所以一般的網(wǎng)站不需要調(diào)整這些指令的默認(rèn)值。可能需要處理最大超過256個(gè)并發(fā)請(qǐng)求的服務(wù)器可能需要增加MaxClients的值。內(nèi)存比較小的機(jī)器則需要減少M(fèi)axClients的值以保證服務(wù)器不會(huì)崩潰。更多關(guān)于調(diào)整進(jìn)程產(chǎn)生的問題請(qǐng)參見性能方面的提示。
在Unix系統(tǒng)中,父進(jìn)程通常以root身份運(yùn)行以便邦定80端口,而Apache產(chǎn)生的子進(jìn)程通常以一個(gè)低特權(quán)的用戶運(yùn)行。User和Group指令用于設(shè)置子進(jìn)程的低特權(quán)用戶。運(yùn)行子進(jìn)程的用戶必須要對(duì)它所服務(wù)的內(nèi)容有讀取的權(quán)限,但是對(duì)服務(wù)內(nèi)容之外的其他資源必須擁有盡可能少的權(quán)限。
MaxRequestsPerChild指令控制服務(wù)器殺死舊進(jìn)程產(chǎn)生新進(jìn)程的頻率。
Apache MPM worker
支持混合的多線程多進(jìn)程的多路處理模塊
概述
此多路處理模塊(MPM)使網(wǎng)絡(luò)服務(wù)器支持混合的多線程多進(jìn)程。由于使用線程來處理請(qǐng)求,所以可以處理海量請(qǐng)求,而系統(tǒng)資源的開銷小于基于進(jìn)程的MPM。但是,它也使用了多進(jìn)程,每個(gè)進(jìn)程又有多個(gè)線程,以獲得基于進(jìn)程的MPM的穩(wěn)定性。
控制這個(gè)MPM的最重要的指令是,控制每個(gè)子進(jìn)程允許建立的線程數(shù)的ThreadsPerChild指令,和控制允許建立的總線程數(shù)的MaxClients指令。
工作方式
每個(gè)進(jìn)程可以擁有的線程數(shù)量是固定的。服務(wù)器會(huì)根據(jù)負(fù)載情況增加或減少進(jìn)程數(shù)量。一個(gè)單獨(dú)的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)子進(jìn)程的建立。每個(gè)子進(jìn)程可以建立ThreadsPerChild數(shù)量的服務(wù)線程和一個(gè)監(jiān)聽線程,該監(jiān)聽線程監(jiān)聽接入請(qǐng)求并將其傳遞給服務(wù)線程處理和應(yīng)答。
Apache總是試圖維持一個(gè)備用(spare)或是空閑的服務(wù)線程池。這樣,客戶端無須等待新線程或新進(jìn)程的建立即可得到處理。初始化時(shí)建立的進(jìn)程數(shù)量由StartServers指令決定。隨后父進(jìn)程檢測(cè)所有子進(jìn)程中空閑線程的總數(shù),并新建或結(jié)束子進(jìn)程使空閑線程的總數(shù)維持在MinSpareThreads和MaxSpareThreads所指定的范圍內(nèi)。由于這個(gè)過程是自動(dòng)調(diào)整的,幾乎沒有必要修改這些指令的缺省值。可以并行處理的客戶端的最大數(shù)量取決于MaxClients指令。活動(dòng)子進(jìn)程的最大數(shù)量取決于MaxClients除以ThreadsPerChild的值。
有兩個(gè)指令設(shè)置了活動(dòng)子進(jìn)程數(shù)量和每個(gè)子進(jìn)程中線程數(shù)量的硬限制。要想改變這個(gè)硬限制必須完全停止服務(wù)器然后再啟動(dòng)服務(wù)器(直接重啟是不行的),ServerLimit是活動(dòng)子進(jìn)程數(shù)量的硬限制,它必須大于或等于MaxClients除以ThreadsPerChild的值。ThreadLimit是所有服務(wù)線程總數(shù)的硬限制,它必須大于或等于ThreadsPerChild指令。這兩個(gè)指令必須出現(xiàn)在其他workerMPM指令的前面。
在設(shè)置的活動(dòng)子進(jìn)程數(shù)量之外,還可能有額外的子進(jìn)程處于"正在中止"的狀態(tài)但是其中至少有一個(gè)服務(wù)線程仍然在處理客戶端請(qǐng)求,直到到達(dá)MaxClients以致結(jié)束進(jìn)程,雖然實(shí)際數(shù)量會(huì)很小。這個(gè)行為能夠通過以下禁止特別的子進(jìn)程中止的方法來避免:
* 將MaxRequestsPerChild設(shè)為"0"
* 將MaxSpareThreads和MaxClients設(shè)為相同的值
一個(gè)典型的針對(duì)workerMPM的配置如下:
ServerLimit 16
StartServers 2
MaxClients
150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild
25
在Unix中,為了能夠綁定80端口,父進(jìn)程一般都是以root身份啟動(dòng),隨后,Apache以較低權(quán)限的用戶建立子進(jìn)程和線程。User和Group指令用于設(shè)置Apache子進(jìn)程的權(quán)限。雖然子進(jìn)程必須對(duì)其提供的內(nèi)容擁有讀權(quán)限,但應(yīng)該盡可能給予它較少的特權(quán)。另外,除非使用了suexec
,否則,這些指令設(shè)置的權(quán)限將被CGI腳本所繼承。
MaxRequestsPerChild指令用于控制服務(wù)器建立新進(jìn)程和結(jié)束舊進(jìn)程的頻率。
常用指令:
StartServers
指令
StartServers指令設(shè)置了服務(wù)器啟動(dòng)時(shí)建立的子進(jìn)程數(shù)量。因?yàn)樽舆M(jìn)程數(shù)量動(dòng)態(tài)的取決于負(fù)載的輕重,所有一般沒有必要調(diào)整這個(gè)參數(shù)。
MinSpareServers
指令
MinSpareServers指令設(shè)置空閑子進(jìn)程的最小數(shù)量。所謂空閑子進(jìn)程是指沒有正在處理請(qǐng)求的子進(jìn)程。如果當(dāng)前空閑子進(jìn)程數(shù)少于MinSpareServers
,那么Apache將以最大每秒一個(gè)的速度產(chǎn)生新的子進(jìn)程。
只有在非常繁忙機(jī)器上才需要調(diào)整這個(gè)參數(shù)。將此參數(shù)設(shè)的太大通常是一個(gè)壞主意。
MaxSpareServers
指令
MaxSpareServers指令設(shè)置空閑子進(jìn)程的最大數(shù)量。所謂空閑子進(jìn)程是指沒有正在處理請(qǐng)求的子進(jìn)程。如果當(dāng)前有超過MaxSpareServers數(shù)量的空閑子進(jìn)程,那么父進(jìn)程將殺死多余的子進(jìn)程。
只有在非常繁忙機(jī)器上才需要調(diào)整這個(gè)參數(shù)。將此參數(shù)設(shè)的太大通常是一個(gè)壞主意。如果你將該指令的值設(shè)置為比MinSpareServers小,Apache將會(huì)自動(dòng)將其修改成"MinSpareServers+1"。
MaxClients
指令
MaxClients指令設(shè)置了允許同時(shí)伺服的最大接入請(qǐng)求數(shù)量。任何超過MaxClients限制的請(qǐng)求都將進(jìn)入等候隊(duì)列,直到達(dá)到ListenBacklog指令限制的最大值為止。一旦一個(gè)鏈接被釋放,隊(duì)列中的請(qǐng)求將得到服務(wù)。
對(duì)于非線程型的MPM(也就是prefork),MaxClients表示可以用于伺服客戶端請(qǐng)求的最大子進(jìn)程數(shù)量,默認(rèn)值是256。要增大這個(gè)值,你必須同時(shí)增大ServerLimit
。
對(duì)于線程型或者混合型的MPM(也就是beos或worker),MaxClients表示可以用于伺服客戶端請(qǐng)求的最大線程數(shù)量。線程型的beos的默認(rèn)值是50。對(duì)于混合型的MPM默認(rèn)值是16(ServerLimit)乘以25(ThreadsPerChild)的結(jié)果。因此要將MaxClients增加到超過16個(gè)進(jìn)程才能提供的時(shí)候,你必須同時(shí)增加ServerLimit的值。
MaxRequestsPerChild
指令
MaxRequestsPerChild指令設(shè)置每個(gè)子進(jìn)程在其生存期內(nèi)允許伺服的最大請(qǐng)求數(shù)量。到達(dá)MaxRequestsPerChild的限制后,子進(jìn)程將會(huì)結(jié)束。如果MaxRequestsPerChild為"0",子進(jìn)程將永遠(yuǎn)不會(huì)結(jié)束。
不同的默認(rèn)值
在mpm_netware和mpm_winnt上的默認(rèn)值是"0"。
將MaxRequestsPerChild設(shè)置成非零值有兩個(gè)好處:
*
可以防止(偶然的)內(nèi)存泄漏無限進(jìn)行,從而耗盡內(nèi)存。
*
給進(jìn)程一個(gè)有限獸命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時(shí)候減少活動(dòng)進(jìn)程的數(shù)量。
注意:
對(duì)于KeepAlive鏈接,只有第一個(gè)請(qǐng)求會(huì)被計(jì)數(shù)。事實(shí)上,它改變了每個(gè)子進(jìn)程限制最大鏈接數(shù)量的行為。
ThreadsPerChild
指令
這個(gè)指令設(shè)置了每個(gè)子進(jìn)程建立的線程數(shù)。子進(jìn)程在啟動(dòng)時(shí)建立這些線程后就不再建立新的線程了。如果使用一個(gè)類似于mpm_winnt只有一個(gè)子進(jìn)程的MPM,這個(gè)數(shù)值要足夠大,以便可以處理可能的請(qǐng)求高峰。如果使用一個(gè)類似于worker有多個(gè)子進(jìn)程的MPM,每個(gè)子進(jìn)程所擁有的所有線程的總數(shù)要足夠大,以便可以處理可能的請(qǐng)求高峰。
對(duì)于mpm_winnt,ThreadsPerChild的默認(rèn)值是64;對(duì)于其他MPM是25。
ThreadLimit
指令
這個(gè)指令設(shè)置了每個(gè)子進(jìn)程可配置的線程數(shù)ThreadsPerChild上限。任何在重啟期間對(duì)這個(gè)指令的改變都將被忽略,但對(duì)ThreadsPerChild的修改卻會(huì)生效。
使用這個(gè)指令時(shí)要特別當(dāng)心。如果將ThreadLimit設(shè)置成一個(gè)高出ThreadsPerChild實(shí)際需要很多的值,將會(huì)有過多的共享內(nèi)存被分配。如果將ThreadLimit和ThreadsPerChild設(shè)置成超過系統(tǒng)的處理能力,Apache可能無法啟動(dòng),或者系統(tǒng)將變得不穩(wěn)定。該指令的值應(yīng)當(dāng)和ThreadsPerChild可能達(dá)到的最大值保持一致。
對(duì)于mpm_winnt,ThreadLimit的默認(rèn)值是1920;對(duì)于其他MPM這個(gè)值是64。
注意:
Apache在編譯時(shí)內(nèi)部有一個(gè)硬性的限制"ThreadLimit
"(對(duì)于mpm_winnt是"ThreadLimit "),你不能超越這個(gè)限制。
ServerLimit
指令
對(duì)于preforkMPM,這個(gè)指令設(shè)置了MaxClients最大允許配置的數(shù)值。對(duì)于workerMPM,這個(gè)指令和ThreadLimit結(jié)合使用設(shè)置了MaxClients最大允許配置的數(shù)值。任何在重啟期間對(duì)這個(gè)指令的改變都將被忽略,但對(duì)MaxClients的修改卻會(huì)生效。
使用這個(gè)指令時(shí)要特別當(dāng)心。如果將ServerLimit設(shè)置成一個(gè)高出實(shí)際需要許多的值,將會(huì)有過多的共享內(nèi)存被分配。如果將ServerLimit和MaxClients設(shè)置成超過系統(tǒng)的處理能力,Apache可能無法啟動(dòng),或者系統(tǒng)將變得不穩(wěn)定。
對(duì)于preforkMPM,只有在你需要將MaxClients設(shè)置成高于默認(rèn)值256的時(shí)候才需要使用這個(gè)指令。要將此指令的值保持和MaxClients一樣。
對(duì)于workerMPM,只有在你需要將MaxClients和ThreadsPerChild設(shè)置成需要超過默認(rèn)值16個(gè)子進(jìn)程的時(shí)候才需要使用這個(gè)指令。不要將該指令的值設(shè)置的比MaxClients
和ThreadsPerChild需要的子進(jìn)程數(shù)量高。
注意:
Apache在編譯時(shí)內(nèi)部有一個(gè)硬限制"ServerLimit
"(對(duì)于preforkMPM為"ServerLimit ")。你不能超越這個(gè)限制。
配置apache使用workerMPM:
cd httpd-2.0.55
make clean
vi server/mpm/worker/worker.c
修改define
DEFAULT_THREAD_LIMIT 64 為100
即=你要設(shè)置的ThreadsPerChild的值(修改默認(rèn)ThreadsPerChild
)
修改define
DEFAULT_SERVER_LIMIT 16 為 25
即=你要設(shè)置的ServerLimit值(修改默認(rèn)ServerLimit值)
:wq
./configure
--prefix=/usr/local/apache --with-mpm=worker
make
make install
cd
/usr/local/apache/conf
vi httpd.conf
修改
StartServers
2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads
75
ThreadsPerChild 25
MaxRequestsPerChild 0
內(nèi)容為
StartServers
3
MaxClients 2000
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads
200
ThreadLimit 200
ThreadsPerChild 100
MaxRequestsPerChild 0
修改
serveradmin servername等信息為正確配置
:wq
/usr/local/apache/bin/apachectl
start
vi /etc/rc.loacl
添加 /usr/local/apache/bin/apachectl
start
PS:
用netstat -an|grep ESTABLISHED|grep 202.100.85.249:80 |wc -l
看連接數(shù),使用worker模式后,httpd進(jìn)程數(shù)變少不能反映tcp連接數(shù)
1.安裝VMtools for linux:
選擇vmware
workstation程序菜單中VM
2. 進(jìn)入linux
掛載vmtools 安裝文件:
mount /dev/cdrom
/mnt/cdrom(vmtools的安裝文件放在vmware虛擬的cdrom中,首先要mount上這個(gè)光驅(qū)才能找到安裝文件)
進(jìn)入/mnt/cdrom 目錄,把安裝文件解壓到/tmp :
cd /mnt/cdrom
tar -zxvf
VMwareTools-5.0.0-12124.i386.tar.gz -C /tmp(把安裝文件解壓到/tmp)
執(zhí)行vwware的安裝腳本:
cd
/tmp/vmware-tools-distrib
./vmware-install.pl
在這里,安裝程序會(huì)詢問安裝文件存放位置和設(shè)置分辨率等一系列問題,在大多數(shù)情況下,安裝默認(rèn)配置vmware
tools就可以正常工作,因此,這里對(duì)每一個(gè)問題按回車鍵選擇默認(rèn)配置。
安裝完以后,vmware會(huì)添加一個(gè)vmhgfs的模塊到內(nèi)核中,可以使用lsmod查看.
3.設(shè)置共享文件夾:
選擇vmware
workstation程序菜單中VM>Settings>Options>Shared Folders
>Properties
點(diǎn)擊對(duì)話框右下的“add”按鈕,點(diǎn)擊“下一步”
在文本框“name”中輸入共享目錄的名字(這里填寫的目錄名以后VM的linux系統(tǒng)中將顯示出同樣的目錄名),比如:win_linux_share
下一個(gè)對(duì)話框是選擇共享的方式:Enable
this share是指這個(gè)共享長期有效,目錄可讀寫;Read-only方式是指這個(gè)共享長期有效,目錄只讀;Disable after this
session方式是指下次ghost computer被關(guān)閉或掛起后,共享將會(huì)失效。一般情況下選擇Enable this share然后點(diǎn)擊“完成”
shared folder設(shè)置完畢
4.在VM的linux查看shared
folder目錄的使用
cd /mnt/hgfs
/mnt/hgfs/目錄下就同步了windows中的win_linux_share文件夾
[root@localhost network-scripts]# cd
/mnt/hgfs
[root@localhost hgfs]# ls
win_linux_share
[root@localhost
hgfs]# cd win_linux_share/
[root@localhost win_linux_share]#
ls
sunzhaoyao.txt
ichartjs是一款基于HTML5的圖形庫。使用純javascript語言,利用HTML5的canvas標(biāo)簽繪制各式圖形。ichartjs可以為web應(yīng)用提供簡(jiǎn)單、直觀、可交互的體驗(yàn)級(jí)圖表組件。是web圖表方面的解決方案。最近正好在學(xué)HTML5,順便就用ichartjs來練習(xí)。ichartjs目前支持餅圖、折線圖、區(qū)域圖、柱形圖、條形圖。ichartjs是基于Apache License 2.0 協(xié)議的開源項(xiàng)目。今天介紹的是如何在android手機(jī)上動(dòng)態(tài)實(shí)現(xiàn)3D柱形圖。若想詳細(xì)了解ichartjs,可以訪問ichartjs官網(wǎng):http://www.ichartjs.cn/index.html
實(shí)現(xiàn)主要原理是所需實(shí)現(xiàn)的數(shù)據(jù)打包成json格式,因?yàn)閕chartjs規(guī)定的數(shù)據(jù)源統(tǒng)一采用json對(duì)象方式。數(shù)據(jù)源分為單一數(shù)據(jù)源與集合多值數(shù)據(jù)源,單一數(shù)據(jù)源的值為單一的數(shù)值,而集合多值數(shù)據(jù)源為數(shù)值集合。3D柱形圖使用的單一的數(shù)據(jù)源。廢話不多說了,直接上代碼。
首先編寫的是封裝數(shù)據(jù)的實(shí)體類Contact:
接著創(chuàng)建一個(gè)list將所需要的contact對(duì)象添加到list中:
函數(shù)trunc是一個(gè)Oracle內(nèi)置的函數(shù),可以對(duì)date類型數(shù)據(jù)進(jìn)行“度身裁剪”,來適應(yīng)不同類型的數(shù)據(jù)需求。
在前篇《Oracle日期類型操作幾個(gè)問題》中,我們已經(jīng)了解到date類型的基本知識(shí)。date類型是一種包括年、月、日、時(shí)、分和秒的數(shù)據(jù)類型,可以表示相對(duì)精確的時(shí)間信息。內(nèi)部存儲(chǔ)上,date類型是類似于數(shù)字類型的,可以通過加減操作實(shí)現(xiàn)對(duì)日期的推進(jìn)和后退。
但是,日期格式的精確常常給我們帶來一些困擾,特別是其中的時(shí)分秒信息。很多時(shí)候,我們對(duì)這部分信息是不需要的。比如指定日期查詢、只顯示天信息等等。借助To_char雖然可以實(shí)現(xiàn)一部分這種需要,但是這樣做格式上比較復(fù)雜,而且進(jìn)行了數(shù)據(jù)類型的轉(zhuǎn)換。是否存在不變化數(shù)據(jù)類型的方法,對(duì)日期型數(shù)據(jù)進(jìn)行處理。答案就是trunc函數(shù)。
trunc(date)
截?cái)嗪瘮?shù)trunc的作用就是將日期類型數(shù)據(jù)按照指定格式截?cái)啵祷匾粋€(gè)日期變量數(shù)據(jù)。例如:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2010-12-10 20:39:58
SQL> select trunc(sysdate) from dual;
TRUNC(SYSDATE)
--------------
2010-12-10
SQL> select to_char(trunc(sysdate),'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(TRUNC(SYSDATE),'YYYY-M
------------------------------
2010-12-10 00:00:00
默認(rèn)情況下,sysdate函數(shù)返回的日期類型數(shù)據(jù)包括當(dāng)前的具體時(shí)間。通過trunc(date)的處理,直接截取到天信息,返回指定天的零時(shí)。
trunc函數(shù)還支持一個(gè)重載參數(shù),格式字符串:trunc(date,‘format’),用于指定截?cái)嗟奈恢谩H缦拢?/font>
//截?cái)嗟侥?/font>
SQL> select trunc(sysdate,'yyyy') from dual;
TRUNC(SYSDATE,'YYYY')
---------------------
2010-1-1
//截?cái)嗟皆?/font>
SQL> select trunc(sysdate,'mm') from dual;
TRUNC(SYSDATE,'MM')
-------------------
2010-12-1
//截?cái)嗟饺?/font>
SQL> select trunc(sysdate,'dd') from dual;
TRUNC(SYSDATE,'DD')
-------------------
2010-12-10
//截?cái)嗟叫r(shí)
SQL> select trunc(sysdate,'hh24') from dual;
TRUNC(SYSDATE,'HH24')
---------------------
2010-12-10 20:00:00
//截?cái)嗟椒昼?/font>
SQL> select trunc(sysdate,'mi') from dual;
TRUNC(SYSDATE,'MI')
-------------------
2010-12-10 20:52:00
使用不同的格式標(biāo)志,可以指示不同的截?cái)辔恢茫@取各種零刻時(shí)間。
|
格式字符串 |
說明 |
年 |
yyyy或者year |
年度第一天(一月一日零時(shí)) |
月 |
mm或者month |
月份第一天(一日零時(shí)) |
日 |
dd或者day |
日期零時(shí)(00:00:00) |
小時(shí) |
hh或者h(yuǎn)h24 |
幾時(shí)整(XX:00:00) |
分 |
mi |
幾分整(XX:XX:00) |
借助trunc函數(shù)和日期類型加減處理,我們可以實(shí)現(xiàn)一些特殊日期的設(shè)置,實(shí)現(xiàn)日期功能,使用在例如Job調(diào)度方面。
//明天零點(diǎn)
SQL> select to_char(trunc(sysdate)+1,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(TRUNC(SYSDATE)+1,'YYYY
------------------------------
2010-12-11 00:00:00
//當(dāng)天早上十點(diǎn)
SQL> select to_char(trunc(sysdate)+10/24,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(TRUNC(SYSDATE)+10/24,'
------------------------------
2010-12-10 10:00:00
//當(dāng)月三號(hào),上午10點(diǎn)半
SQL> select to_char(trunc(sysdate,'mm')+2+10/24+1/48, 'yyyy-mm-dd hh24:mi:ss') from dual;
注:trunc(sysdate,'mm')將時(shí)間取到當(dāng)前月的1號(hào)零時(shí)零分零秒,那么加上2就表示當(dāng)前月的3好零時(shí)零分零秒,再加上'10/24'('10/24'本身表示10個(gè)小時(shí))就是表示當(dāng)月3號(hào)的十點(diǎn)零分零秒,再加上'1/48'('1/48'本身表示30分鐘)就表示當(dāng)月3號(hào)十點(diǎn)三十分零秒
TO_CHAR(TRUNC(SYSDATE,'MM')+2+
------------------------------
2010-12-03 10:30:00
較復(fù)雜的to_char,trunc更加可以發(fā)揮日期類型數(shù)值本身的特色和優(yōu)勢(shì),無論是代碼整潔度還是處理效率都是值得關(guān)注的。
額外多說一句,trunc本身還具有處理數(shù)字截?cái)喙δ埽糜诮財(cái)嘀付ㄎ粩?shù)的數(shù)字類型。
//默認(rèn)截?cái)嗟秸麛?shù),不進(jìn)行四舍五入;
SQL> select trunc(15.743) from dual;
TRUNC(15.743)
-------------
15
//截?cái)嗟叫?shù)點(diǎn)后一位;
SQL> select trunc(15.793,1) from dual;
TRUNC(15.793,1)
---------------
15.7
//截?cái)嗟叫?shù)點(diǎn)前一位;
SQL> select trunc(15.793,-1) from dual;
TRUNC(15.793,-1)
----------------
10
trunc對(duì)數(shù)字和日期類型處理,也折射出日期類型數(shù)據(jù)和數(shù)字之間的間接關(guān)系。
原文地址:http://space.itpub.net/17203031/viewspace-681548
trunc不僅可以用來處理日期,還可以用來處理數(shù)字
TRUNC(i1,i2)截取i1的i2位而不四舍五入,如果i2是正就截取小數(shù)點(diǎn)右邊第幾位,如果是i2是負(fù)就是截取小數(shù)點(diǎn)左邊第幾位。
例如:
- select TRUNC(0.10005767,1) from dual;
- TRUNC(0.10005767,1) 1 0.1
而如果trunc函數(shù)沒有指定參i2,那么其作用為取整,且取整的時(shí)候不會(huì)四舍五入
例如:
- select TRUNC(2.60005767) from dual;
TRUNC(2.60005767)
round函數(shù)和trunc函數(shù)的區(qū)別:
ROUND(i1,i2)四舍五入,i1四舍五入,如果i2是正保留小數(shù)點(diǎn)后i2位。如果是i2是負(fù)數(shù),表示保留小數(shù)點(diǎn)前面(左邊第幾位)
TRUNC(i1,i2)截取i1的i2位而不四舍五入,如果i2是正就截取小數(shù)點(diǎn)右邊第幾位,如果是i2是負(fù)就是截取小數(shù)點(diǎn)左邊第幾位。
位置 |
時(shí)間域名 |
允許值 |
允許的特殊字符 |
1 |
秒 |
0-59 |
, - * / |
2 |
分鐘 |
0-59 |
, - * / |
3 |
小時(shí) |
0-23 |
, - * / |
4 |
日期 |
1-31 |
, - * ? / L W C |
5 |
月份 |
1-12 |
, - * / |
6 |
星期 |
1-7 |
, - * ? / L C # |
7 |
年(可選) |
空值1970-2099 |
, - * / |
Cron表達(dá)式的時(shí)間字段除允許設(shè)置數(shù)值外,還可使用一些特殊的字符,提供列表、范圍、通配符等功能,細(xì)說如下:
●星號(hào)(*):可用在所有字段中,表示對(duì)應(yīng)時(shí)間域的每一個(gè)時(shí)刻,例如,*在分鐘字段時(shí),表示“每分鐘”;
●問號(hào)(?):該字符只在日期和星期字段中使用,它通常指定為“無意義的值”,相當(dāng)于點(diǎn)位符;
●減號(hào)(-):表達(dá)一個(gè)范圍,如在小時(shí)字段中使用“10-12”,則表示從10到12點(diǎn),即10,11,12;
●逗號(hào)(,):表達(dá)一個(gè)列表值,如在星期字段中使用“MON,WED,FRI”,則表示星期一,星期三和星期五;
●斜杠(/):x/y表達(dá)一個(gè)等步長序列,x為起始值,y為增量步長值。如在分鐘字段中使用0/15,則表示為0,15,30和45秒,而5/15在分鐘字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;
●L:該字符只在日期和星期字段中使用,代表“Last”的意思,但它在兩個(gè)字段中意思不同。L在日期字段中,表示這個(gè)月份的最后一天,如一月的31號(hào),非閏年二月的28號(hào);如果L用在星期中,則表示星期六,等同于7。但是,如果L出現(xiàn)在星期字段里,而且在前面有一個(gè)數(shù)值X,則表示“這個(gè)月的最后X天”,例如,6L表示該月的最后星期五;
●W:該字符只能出現(xiàn)在日期字段里,是對(duì)前導(dǎo)日期的修飾,表示離該日期最近的工作日。例如15W表示離該月15號(hào)最近的工作日,如果該月15號(hào)是星期六,則匹配14號(hào)星期五;如果15日是星期日,則匹配16號(hào)星期一;如果15號(hào)是星期二,那結(jié)果就是15號(hào)星期二。但必須注意關(guān)聯(lián)的匹配日期不能夠跨月,如你指定1W,如果1號(hào)是星期六,結(jié)果匹配的是3號(hào)星期一,而非上個(gè)月最后的那天。W字符串只能指定單一日期,而不能指定日期范圍;
●LW組合:在日期字段可以組合使用LW,它的意思是當(dāng)月的最后一個(gè)工作日;
●井號(hào)(#):該字符只能在星期字段中使用,表示當(dāng)月某個(gè)工作日。如6#3表示當(dāng)月的第三個(gè)星期五(6表示星期五,#3表示當(dāng)前的第三個(gè)),而4#5表示當(dāng)月的第五個(gè)星期三,假設(shè)當(dāng)月沒有第五個(gè)星期三,忽略不觸發(fā);
● C:該字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是計(jì)劃所關(guān)聯(lián)的日期,如果日期沒有被關(guān)聯(lián),則相當(dāng)于日歷中所有日期。例如5C在日期字段中就相當(dāng)于日歷5日以后的第一天。1C在星期字段中相當(dāng)于星期日后的第一天。Cron表達(dá)式對(duì)特殊字符的大小寫不敏感,對(duì)代表星期的縮寫英文大小寫也不敏感。表2下面給出一些完整的Cron表示式的實(shí)例:
表2 Cron表示式示例
表示式 |
說明 |
"0 0 12 * * ? " |
每天12點(diǎn)運(yùn)行 |
"0 15 10 ? * *" |
每天10:15運(yùn)行 |
"0 15 10 * * ?" |
每天10:15運(yùn)行 |
"0 15 10 * * ? *" |
每天10:15運(yùn)行 |
"0 15 10 * * ? 2008" |
在2008年的每天10:15運(yùn)行 |
"0 * 14 * * ?" |
每天14點(diǎn)到15點(diǎn)之間每分鐘運(yùn)行一次,開始于14:00,結(jié)束于14:59。 |
"0 0/5 14 * * ?" |
每天14點(diǎn)到15點(diǎn)每5分鐘運(yùn)行一次,開始于14:00,結(jié)束于14:55。 |
"0 0/5 14,18 * * ?" |
每天14點(diǎn)到15點(diǎn)每5分鐘運(yùn)行一次,此外每天18點(diǎn)到19點(diǎn)每5鐘也運(yùn)行一次。 |
"0 0-5 14 * * ?" |
每天14:00點(diǎn)到14:05,每分鐘運(yùn)行一次。 |
"0 10,44 14 ? 3 WED" |
3月每周三的14:10分到14:44,每分鐘運(yùn)行一次。 |
"0 15 10 ? * MON-FRI" |
每周一,二,三,四,五的10:15分運(yùn)行。 |
"0 15 10 15 * ?" |
每月15日10:15分運(yùn)行。 |
"0 15 10 L * ?" |
每月最后一天10:15分運(yùn)行。 |
"0 15 10 ? * 6L" |
每月最后一個(gè)星期五10:15分運(yùn)行。 |
"0 15 10 ? * 6L 2007-2009" |
在2007,2008,2009年每個(gè)月的最后一個(gè)星期五的10:15分運(yùn)行。 |
"0 15 10 ? * 6#3" |
每月第三個(gè)星期五的10:15分運(yùn)行。 |
LoginAny 使用筆記
想實(shí)現(xiàn)在家辦公,當(dāng)公司有急事的時(shí)候,可以在家就處理掉;不必在家里和公司之間copy文件,免去勞苦奔波之苦。于是開始用遠(yuǎn)程軟件。
1. VNN. 免費(fèi),主要面向游戲平臺(tái)。
申請(qǐng)2個(gè)用戶,互相加為密友,能夠2臺(tái)機(jī)器互訪,但是只有vnnc302201-winall.zip版本能用(密友功能),且不能升級(jí),一旦升級(jí)之后,將沒有了密友功能。
用了一段時(shí)間,很不錯(cuò)。但不久之后,本地域內(nèi)3389端口封了。理解,因?yàn)檫h(yuǎn)程桌面的3389是個(gè)不安全的端口。
其實(shí),把被控機(jī)器的Terminal Service 3389端口改掉, 理論上也是可行的,但是還是比較麻煩。
2. Hamachi, 很好用的的軟件。推薦,IP局域網(wǎng)穿透。 3389端口還是不能連接,道理同上。
3. 改用LoginAny. 免費(fèi)版每月只能遠(yuǎn)程桌面20分鐘,文件傳輸3次。速度超快。 遠(yuǎn)程桌面是LoginAny開發(fā)的,所以不再用3389端口。
自己研究下能否逆向工程下…
———先看文件傳輸功能———–
打開eXeScope分析資源,首先查看文字:"文件傳輸已經(jīng)達(dá)到最大使用次數(shù)!",String Id: 484
得知Dialog: 1218是提示對(duì)話框, Dialog: 1219是文件傳輸Form.
打開OllyICE,反編譯后,
- 搜索4C2(1218), 找提示對(duì)話框的代碼,自己標(biāo)注附近的代碼,這是一個(gè)功能函數(shù)。
搜索4C3(1219), 找文件傳輸Form相關(guān)代碼。
搜索1E4(484), 找"文件傳輸已經(jīng)達(dá)到最大使用次數(shù)!"的相關(guān)代碼。
004938D0 /$ 55 push ebp
004938D1 |. 8BEC mov ebp, esp
004938D3 |. 6A FF push -1
004938D5 |. 68 87C25B00 push 005BC287 ; SE 處理程序安裝
004938DA |. 64:A1 0000000>mov eax, dword ptr fs:[0]
004938E0 |. 50 push eax
004938E1 |. 64:8925 00000>mov dword ptr fs:[0], esp
004938E8 |. 81EC BC000000 sub esp, 0BC
004938EE |. A1 BCEB6200 mov eax, dword ptr [62EBBC]
004938F3 |. 33C5 xor eax, ebp
004938F5 |. 8945 EC mov dword ptr [ebp-14], eax
004938F8 |. 898D 40FFFFFF mov dword ptr [ebp-C0], ecx
004938FE |. C785 4CFFFFFF>mov dword ptr [ebp-B4], 1
00493908 |. 6A 01 push 1
0049390A |. 8B85 4CFFFFFF mov eax, dword ptr [ebp-B4]
00493910 |. 50 push eax
00493911 |. 8B8D 40FFFFFF mov ecx, dword ptr [ebp-C0]
00493917 |. E8 D4EFFFFF call 004928F0 ; 關(guān)鍵Call !!!!
0049391C |. 85C0 test eax, eax
0049391E |. 75 05 jnz short 00493925
00493920 |. E9 F8000000 jmp 00493A1D
00493925 |> C785 48FFFFFF>mov dword ptr [ebp-B8], 0
0049392F |. 8D4D F0 lea ecx, dword ptr [ebp-10]
00493932 |. FF15 28B95C00 call dword ptr [<&MFC71.#310_ATL::CStringT<char,StrTrai>; MFC71.7C173199
00493938 |. C745 FC 00000>mov dword ptr [ebp-4], 0
0049393F |. 6A 00 push 0
00493941 |. 8D8D 54FFFFFF lea ecx, dword ptr [ebp-AC]
00493947 |. E8 64D30800 call 00520CB0
0049394C |. C645 FC 01 mov byte ptr [ebp-4], 1
00493950 |. 8B8D 4CFFFFFF mov ecx, dword ptr [ebp-B4]
00493956 |. 51 push ecx
00493957 |. 68 DD000000 push 0DD
0049395C |. 8D55 F0 lea edx, dword ptr [ebp-10]
0049395F |. 52 push edx
00493960 |. 8D85 54FFFFFF lea eax, dword ptr [ebp-AC]
00493966 |. 50 push eax
00493967 |. 8D8D 48FFFFFF lea ecx, dword ptr [ebp-B8]
0049396D |. 51 push ecx
0049396E |. 8B8D 40FFFFFF mov ecx, dword ptr [ebp-C0]
00493974 |. E8 A7190000 call 00495320 ; MessageBox ….
00493979 |. 85C0 test eax, eax
0049397B |. 75 21 jnz short 0049399E
0049397D |. C645 FC 00 mov byte ptr [ebp-4], 0
00493981 |. 8D8D 54FFFFFF lea ecx, dword ptr [ebp-AC]
00493987 |. E8 24D40800 call 00520DB0
0049398C |. C745 FC FFFFF>mov dword ptr [ebp-4], -1
00493993 |. 8D4D F0 lea ecx, dword ptr [ebp-10]
00493996 |. FF15 68B95C00 call dword ptr [<&MFC71.#578_ATL::CStringT<char,StrTrai>; MFC71.7C1771B1
0049399C |. EB 7F jmp short 00493A1D
0049399E |> 8B95 48FFFFFF mov edx, dword ptr [ebp-B8]
004939A4 |. 52 push edx
004939A5 |. 68 2CF16200 push 0062F12C
004939AA |. 51 push ecx
004939AB |. 8BCC mov ecx, esp
004939AD |. 89A5 44FFFFFF mov dword ptr [ebp-BC], esp
004939B3 |. 8D45 F0 lea eax, dword ptr [ebp-10]
004939B6 |. 50 push eax
004939B7 |. FF15 38B95C00 call dword ptr [<&MFC71.#297_ATL::CStringT<char,StrTrai>; MFC71.7C14E575
004939BD |. 8985 3CFFFFFF mov dword ptr [ebp-C4], eax
004939C3 |. 8D8D 54FFFFFF lea ecx, dword ptr [ebp-AC]
004939C9 |. 51 push ecx
004939CA |. B9 E4F26200 mov ecx, 0062F2E4
004939CF |. E8 ECDAFCFF call 004614C0 ; 調(diào)用打開文件傳輸Form
004939D4 |. 8985 38FFFFFF mov dword ptr [ebp-C8], eax
004939DA |. 8B95 38FFFFFF mov edx, dword ptr [ebp-C8]
004939E0 |. 8995 50FFFFFF mov dword ptr [ebp-B0], edx
004939E6 |. 6A 05 push 5
004939E8 |. 8B8D 50FFFFFF mov ecx, dword ptr [ebp-B0]
004939EE |. E8 6DCC1100 call <jmp.&MFC71.#6090_CWnd::ShowWindow>
004939F3 |. 8B8D 50FFFFFF mov ecx, dword ptr [ebp-B0]
004939F9 |. E8 12D8FAFF call 00441210
004939FE |. C645 FC 00 mov byte ptr [ebp-4], 0
00493A02 |. 8D8D 54FFFFFF lea ecx, dword ptr [ebp-AC]
00493A08 |. E8 A3D30800 call 00520DB0
00493A0D |. C745 FC FFFFF>mov dword ptr [ebp-4], -1
00493A14 |. 8D4D F0 lea ecx, dword ptr [ebp-10]
00493A17 |. FF15 68B95C00 call dword ptr [<&MFC71.#578_ATL::CStringT<char,StrTrai>; MFC71.7C1771B1
00493A1D |> 8B4D F4 mov ecx, dword ptr [ebp-C]
00493A20 |. 64:890D 00000>mov dword ptr fs:[0], ecx
00493A27 |. 8B4D EC mov ecx, dword ptr [ebp-14]
00493A2A |. 33CD xor ecx, ebp
00493A2C |. E8 5ADE1100 call 005B188B
00493A31 |. 8BE5 mov esp, ebp
00493A33 |. 5D pop ebp
00493A34 \. C3 retn
在0049 3917發(fā)現(xiàn)關(guān)鍵Call.
決定修改其后的跳轉(zhuǎn),
00493920 |. E9 F8000000 jmp 00493A1D 這一行是跳過調(diào)用打開文件傳輸Form的代碼。
把它改為:
00493920 |. 90 90909090 Nop 什么也不做
經(jīng)試驗(yàn),文件傳輸功能可以超過3次的使用了。
———遠(yuǎn)程桌面的功能———-
遠(yuǎn)程桌面的功能只能連接20分鐘。 解決辦法還是老一套:
打開eXeScope分析資源,找到對(duì)話框:遠(yuǎn)程桌面,ID=1306.
打開OllyICE,搜索常量1306,很快定位下面代碼:
00493670 /$ 55 push ebp
00493671 |. 8BEC mov ebp, esp
00493673 |. 6A FF push -1
00493675 |. 68 69C25B00 push 005BC269 ; SE 處理程序安裝
0049367A |. 64:A1 0000000>mov eax, dword ptr fs:[0]
00493680 |. 50 push eax
00493681 |. 64:8925 00000>mov dword ptr fs:[0], esp
00493688 |. 81EC D4000000 sub esp, 0D4
0049368E |. A1 BCEB6200 mov eax, dword ptr [62EBBC]
00493693 |. 33C5 xor eax, ebp
00493695 |. 8945 EC mov dword ptr [ebp-14], eax
00493698 |. 898D 30FFFFFF mov dword ptr [ebp-D0], ecx
0049369E |. C785 50FFFFFF>mov dword ptr [ebp-B0], 0
004936A8 |. 6A 01 push 1
004936AA |. 8B85 50FFFFFF mov eax, dword ptr [ebp-B0]
004936B0 |. 50 push eax
004936B1 |. 8B8D 30FFFFFF mov ecx, dword ptr [ebp-D0]
004936B7 |. E8 34F2FFFF call 004928F0 ; 關(guān)鍵Call–remote desk.
004936BC |. 85C0 test eax, eax
004936BE |. 75 05 jnz short 004936C5
004936C0 |. E9 F0010000 jmp 004938B5
004936C5 |> C785 4CFFFFFF>mov dword ptr [ebp-B4], 0
004936CF |. 6A 00 push 0
004936D1 |. 8D8D 54FFFFFF lea ecx, dword ptr [ebp-AC]
004936D7 |. E8 D4D50800 call 00520CB0
004936DC |. C745 FC 00000>mov dword ptr [ebp-4], 0
004936E3 |. 8D4D F0 lea ecx, dword ptr [ebp-10]
004936E6 |. FF15 28B95C00 call dword ptr [<&MFC71.#310_ATL::CStringT<char,StrTrai>; MFC71.7C173199
004936EC |. C645 FC 01 mov byte ptr [ebp-4], 1
004936F0 |. 8B8D 50FFFFFF mov ecx, dword ptr [ebp-B0]
004936F6 |. 51 push ecx
004936F7 |. 68 19010000 push 119
004936FC |. 8D55 F0 lea edx, dword ptr [ebp-10]
004936FF |. 52 push edx
00493700 |. 8D85 54FFFFFF lea eax, dword ptr [ebp-AC]
00493706 |. 50 push eax
00493707 |. 8D8D 4CFFFFFF lea ecx, dword ptr [ebp-B4]
0049370D |. 51 push ecx
0049370E |. 8B8D 30FFFFFF mov ecx, dword ptr [ebp-D0]
00493714 |. E8 071C0000 call 00495320 ; 消息處理
00493719 |. 85C0 test eax, eax
0049371B |. 75 24 jnz short 00493741
0049371D |. C645 FC 00 mov byte ptr [ebp-4], 0
00493721 |. 8D4D F0 lea ecx, dword ptr [ebp-10]
00493724 |. FF15 68B95C00 call dword ptr [<&MFC71.#578_ATL::CStringT<char,StrTrai>; MFC71.7C1771B1
0049372A |. C745 FC FFFFF>mov dword ptr [ebp-4], -1
00493731 |. 8D8D 54FFFFFF lea ecx, dword ptr [ebp-AC]
00493737 |. E8 74D60800 call 00520DB0 ; 字符處理
0049373C |. E9 74010000 jmp 004938B5
00493741 |> 817D A4 01030>cmp dword ptr [ebp-5C], 90301
00493748 |. 0F83 E8000000 jnb 00493836
0049374E |. 8B95 4CFFFFFF mov edx, dword ptr [ebp-B4]
00493754 |. 52 push edx
00493755 |. 6A 00 push 0
00493757 |. 51 push ecx
00493758 |. 8BCC mov ecx, esp
0049375A |. 89A5 38FFFFFF mov dword ptr [ebp-C8], esp
00493760 |. 8D45 F0 lea eax, dword ptr [ebp-10]
00493763 |. 50 push eax
00493764 |. FF15 38B95C00 call dword ptr [<&MFC71.#297_ATL::CStringT<char,StrTrai>; MFC71.7C14E575
0049376A |. 8985 2CFFFFFF mov dword ptr [ebp-D4], eax
00493770 |. 8D8D 54FFFFFF lea ecx, dword ptr [ebp-AC]
00493776 |. 51 push ecx
00493777 |. B9 E4F26200 mov ecx, 0062F2E4
0049377C |. E8 BFD7FCFF call 00460F40 ; ???? XX new opeator
00493781 |. 8985 28FFFFFF mov dword ptr [ebp-D8], eax
00493787 |. 8B95 28FFFFFF mov edx, dword ptr [ebp-D8]
0049378D |. 8995 48FFFFFF mov dword ptr [ebp-B8], edx
00493793 |. 83BD 48FFFFFF>cmp dword ptr [ebp-B8], 0
0049379A |. 0F85 94000000 jnz 00493834
004937A0 |. 8D8D 40FFFFFF lea ecx, dword ptr [ebp-C0]
004937A6 |. FF15 28B95C00 call dword ptr [<&MFC71.#310_ATL::CStringT<char,StrTrai>; MFC71.7C173199
004937AC |. C645 FC 02 mov byte ptr [ebp-4], 2
004937B0 |. 8D8D 44FFFFFF lea ecx, dword ptr [ebp-BC]
004937B6 |. FF15 28B95C00 call dword ptr [<&MFC71.#310_ATL::CStringT<char,StrTrai>; MFC71.7C173199
004937BC |. C645 FC 03 mov byte ptr [ebp-4], 3
004937C0 |. FF15 90AA5C00 call dword ptr [<&KERNEL32.GetLastError>] ; [GetLastError
004937C6 |. 50 push eax
004937C7 |. 68 42010000 push 142
004937CC |. 8D85 44FFFFFF lea eax, dword ptr [ebp-BC]
004937D2 |. 50 push eax
004937D3 |. FF15 3CB95C00 call dword ptr [<&MFC71.#2321_ATL::CStringT<char,StrTra>; MFC71.7C18B260
004937D9 |. 83C4 0C add esp, 0C
004937DC |. 68 00E00000 push 0E000
004937E1 |. 8D8D 40FFFFFF lea ecx, dword ptr [ebp-C0]
004937E7 |. FF15 2CB95C00 call dword ptr [<&MFC71.#4035_ATL::CStringT<char,StrTra>; MFC71.7C153789
004937ED |. 6A 40 push 40
004937EF |. 8D8D 40FFFFFF lea ecx, dword ptr [ebp-C0]
004937F5 |. FF15 30B95C00 call dword ptr [<&MFC71.#876_ATL::CSimpleStringT<char,1>; MFC71.7C158BCD
004937FB |. 50 push eax
004937FC |. 8D8D 44FFFFFF lea ecx, dword ptr [ebp-BC]
00493802 |. FF15 30B95C00 call dword ptr [<&MFC71.#876_ATL::CSimpleStringT<char,1>; MFC71.7C158BCD
00493808 |. 50 push eax
00493809 |. 8B8D 30FFFFFF mov ecx, dword ptr [ebp-D0]
0049380F |. E8 5ECE1100 call <jmp.&MFC71.#4104_CWnd::MessageBoxA>
00493814 |. C645 FC 02 mov byte ptr [ebp-4], 2
00493818 |. 8D8D 44FFFFFF lea ecx, dword ptr [ebp-BC]
0049381E |. FF15 68B95C00 call dword ptr [<&MFC71.#578_ATL::CStringT<char,StrTrai>; MFC71.7C1771B1
00493824 |. C645 FC 01 mov byte ptr [ebp-4], 1
00493828 |. 8D8D 40FFFFFF lea ecx, dword ptr [ebp-C0]
0049382E |. FF15 68B95C00 call dword ptr [<&MFC71.#578_ATL::CStringT<char,StrTrai>; MFC71.7C1771B1
00493834 |> EB 60 jmp short 00493896 ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00493836 |> 8B8D 4CFFFFFF mov ecx, dword ptr [ebp-B4]
0049383C |. 51 push ecx
0049383D |. 68 2CF16200 push 0062F12C
00493842 |. 51 push ecx
00493843 |. 8BCC mov ecx, esp
00493845 |. 89A5 34FFFFFF mov dword ptr [ebp-CC], esp
0049384B |. 8D55 F0 lea edx, dword ptr [ebp-10]
0049384E |. 52 push edx
0049384F |. FF15 38B95C00 call dword ptr [<&MFC71.#297_ATL::CStringT<char,StrTrai>; MFC71.7C14E575
00493855 |. 8985 24FFFFFF mov dword ptr [ebp-DC], eax
0049385B |. 8D85 54FFFFFF lea eax, dword ptr [ebp-AC]
00493861 |. 50 push eax
00493862 |. B9 E4F26200 mov ecx, 0062F2E4
00493867 |. E8 74D9FCFF call 004611E0 ; 調(diào)用1:遠(yuǎn)程桌面的Form
0049386C |. 8985 20FFFFFF mov dword ptr [ebp-E0], eax
00493872 |. 8B8D 20FFFFFF mov ecx, dword ptr [ebp-E0]
00493878 |. 898D 3CFFFFFF mov dword ptr [ebp-C4], ecx
0049387E |. 6A 05 push 5
00493880 |. 8B8D 3CFFFFFF mov ecx, dword ptr [ebp-C4]
00493886 |. E8 D5CD1100 call <jmp.&MFC71.#6090_CWnd::ShowWindow>
0049388B |. 8B8D 3CFFFFFF mov ecx, dword ptr [ebp-C4]
00493891 |. E8 1A72F9FF call 0042AAB0
00493896 |> C645 FC 00 mov byte ptr [ebp-4], 0
0049389A |. 8D4D F0 lea ecx, dword ptr [ebp-10]
0049389D |. FF15 68B95C00 call dword ptr [<&MFC71.#578_ATL::CStringT<char,StrTrai>; MFC71.7C1771B1
004938A3 |. C745 FC FFFFF>mov dword ptr [ebp-4], -1
004938AA |. 8D8D 54FFFFFF lea ecx, dword ptr [ebp-AC]
004938B0 |. E8 FBD40800 call 00520DB0
004938B5 |> 8B4D F4 mov ecx, dword ptr [ebp-C]
004938B8 |. 64:890D 00000>mov dword ptr fs:[0], ecx
004938BF |. 8B4D EC mov ecx, dword ptr [ebp-14]
004938C2 |. 33CD xor ecx, ebp
004938C4 |. E8 C2DF1100 call 005B188B
004938C9 |. 8BE5 mov esp, ebp
004938CB |. 5D pop ebp
004938CC \. C3 retn
找到關(guān)鍵Call.
004936B7 |. E8 34F2FFFF call 004928F0 ; 關(guān)鍵Call–remote desk.
修改關(guān)鍵call之后的跳轉(zhuǎn):
004936C0 |. E9 F0010000 jmp 004938B5
修改為什么都不作。免得它影響后面的代碼。
用9090909090 填充。
經(jīng)試驗(yàn),遠(yuǎn)程桌面功能可以超過20分鐘的使用了。
實(shí)際摸索中還是走了不少彎路,總結(jié)經(jīng)驗(yàn)為:在OllyDbg中,看過的弄明白的函數(shù),要自己加上注釋。 在看其他相關(guān)的代碼的時(shí)候,極有可能就碰到了自己曾經(jīng)注釋過的代碼,這樣一下子就全通了。
Eclipse MyEclipse 沒有響應(yīng) JVM terminated. Exit code=1073807364 錯(cuò)誤 卡住 等怪問題怪現(xiàn)象[解決辦法]
問題描述:
Eclipse的WTP和MyEclipse都會(huì)的怪毛病
在WTP或者M(jìn)yEclipse下 在JSP頁面中<% 和 %>之間寫代碼(即寫:scriptlet代碼)
只要輸入.號(hào) 整個(gè)IDE就卡住了 比如: out. 這個(gè)后面要出來要卡好一會(huì)
強(qiáng)行關(guān)閉出現(xiàn)以下提示:
JVM terminated. Exit code=1073807364
c:\WINDOWS\system32\javaw.exe
-Xms40m
-Xmx256m
-jar F:\eclipse\startup.jar
-os win32
-ws win32
-arch x86
-launcher F:\eclipse\eclipse.exe
-name Eclipse
-showsplash 600
-exitdata f24_7c
-vm c:\WINDOWS\system32\javaw.exe
-vmargs
-Xms40m
-Xmx256m
-jar F:\eclipse\startup.jar
這個(gè)問題 讓我郁悶了好幾天 雖然在JSP中scriptlet的腳本是禁忌 但是有時(shí)候?yàn)榱朔奖銣y(cè)試代碼效果 還是會(huì)偶爾用用
經(jīng)過這次 總結(jié)了一下
解決辦法: (感謝Matrix論壇幾位朋友的幫助)
1: ①:
在Eclipse——Window——Preferences——Java——Installed JREs下
添加你機(jī)子上的1.5+的JDK路徑 添加好后把舊版本的Remove 這樣下次新建工程就不用改了 一勞永逸!
或者:
②:
請(qǐng)將新建WEB工程的JRE 1.42的包remove掉,自己新建一個(gè)你機(jī)子上的1.5+的JDK目錄下的jre的包
要導(dǎo)入的jre路徑包括:
D:\Program Files\Java\jdk1.5.0_06\jre\lib下的 *.jar;以及
D:\Program Files\Java\jdk1.5.0_06\jre\lib\ext下的*.jar.
(這個(gè)問題其實(shí)只這一步就能解決了,謝謝yiqingxiao的提醒)
2: 在eclipse的安裝目錄下用EditPlus編輯eclipse.ini文件,將其中的參數(shù)改成:
-vm=D:\Program Files\Java\jdk1.5.0_06\bin\javaw.exe #這個(gè)看你自己JDK路徑而定
-vmargs #下面參數(shù)視大家內(nèi)存大小 自己選擇合適的大小
-Xms128m
-Xmx512m
-XX:PermSize=64M
-XX:MaxPermSize=128M
3: 裝過orcale的人 最好把環(huán)境變量重新設(shè)置一下:set path=D:\Program Files\Java\jdk1.5.0_06\bin
4: eclipse是3.3的,單獨(dú)運(yùn)行沒什么問題,裝上myeclipse6之后編寫jsp代碼時(shí)聯(lián)想輸入的時(shí)候就會(huì)出現(xiàn)eclipse無響應(yīng)的情況,大概1分鐘左右才能恢復(fù),搜了半天也沒有個(gè)好答案。自己琢磨,用了下面這個(gè)辦法,好了,不知為什么。菜單-->myeclipse-->myeclipse-->files and editors-->html-->visual designer
取消mozilla/firefox和sarari還有show warning......(Linux only)這三個(gè)選項(xiàng)。就好了,你們實(shí)驗(yàn)看看。