WEB开发网      濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻橀弻锝夊箣閿濆棭妫勯梺鍝勵儎缁舵岸寮诲☉妯锋婵鐗婇弫楣冩⒑閸涘﹦鎳冪紒缁橈耿瀵鏁愭径濠勵吅闂佹寧绻傚Λ顓炍涢崟顖涒拺闁告繂瀚烽崕搴g磼閼搁潧鍝虹€殿喛顕ч埥澶娢熼柨瀣垫綌婵犳鍠楅〃鍛存偋閸℃ɑ鍙忔繛鎴炴皑绾捐棄霉閿濆懏鎯堥柍璇茬墢缁辨帡鎮╁畷鍥р拰閻庢鍠涢褔顢樻總绋块唶妞ゆ劧缍嗛埀顒€娲缁樻媴閸涘﹤鏆堥梺瑙勭摃椤曆囷綖濠靛惟闁宠桨鑳堕澶愭⒑闂堟稓绠冲┑顕呭幖鍗遍柛顐ゅ枔缁犻箖鏌涢埄鍏狀亝鎱ㄩ崶銊d簻閹兼番鍨哄畷灞炬叏婵犲啯銇濈€规洏鍔嶇换婵嬪磼濮樺吋缍嬮梺璇插椤旀牠宕伴弽顓熷亯濠靛倸鎽滃畵渚€鏌″搴″箹缂佺姵绋掗妵鍕籍閸屾矮澹曢梺鎸庣☉缁绘ê顫忓ú顏勫窛濠电姴鍟惁鐑芥⒑閸涘﹥澶勯柛瀣嚇閹箖顢楅崟顑芥嫽婵炶揪绲介幗婊堝几閸愨斂浜滄い鎰╁焺濡偓閻庤娲栫紞濠傜暦缁嬭鏃堝焵椤掑倻涓嶉柡宥庡幗閻撳啴鏌涘┑鍡楊仼闁哄棗锕弻娑氣偓锝庡亝瀹曞瞼鈧娲滈崗姗€銆佸鈧幃娆撳箛閳轰胶浠鹃梺闈涙搐鐎氱増淇婇悜鑺ユ櫆闁告挆鍛緰濠电姵顔栭崰鏍晝閵堝绠规い鎰剁稻濞呭繘姊绘担瑙勫仩闁稿孩绮撻崺鈧い鎺戝绾惧鏌熼悙顒傜獮闁哄啫鐗嗗婵囥亜閹捐泛顎撶紒閬嶄憾濮婄粯鎷呯粵瀣秷閻庤娲橀敃銏ゃ€佸鎰佹Ъ濡炪們鍨归敃顏勵潖缂佹ɑ濯撮柛娑橈工閺嗗牆鈹戦悙棰濆殝缂佺姵鎸搁悾鐤亹閹烘垹顓煎銈嗘煥瑜扮偟绮径濞炬斀闁绘劖娼欓悘鐔兼煕閵婏附銇濋柟顕嗙節瀵挳鎮㈢紙鐘电泿闂備浇顫夊妯绘櫠鎼达絿鐭欓柤濮愬€楃壕濂告煃瑜滈崜鐔风暦濮椻偓閸╃偞寰勯崫銉ф晨闂備胶顢婃竟鍫ュ箵椤忓棙顫曢柡鍥╁枑濞呭繐鈹戦悩鎰佸晱闁哥姵鐗犻弫鍐Ω閵夈垺鐎洪梺鎸庣箓濞层倝宕瑰┑鍥╃闁糕剝顨堢粻姘舵煛鐎n亪鍙勯柡宀€鍠栭、娑㈠幢濡も偓閺嗘瑦銇勯妷锕€濮嶆慨濠傤煼瀹曟帒鈻庨幋顓熜滈梻浣侯攰婵倗鍒掑澶婄疄闁靛ň鏅滈崑銊х磼鐎n厽纭舵い锔诲枛閳规垿鎮欓崣澶樻!闂佸憡姊圭敮鐐哄箲閵忋倕骞㈡繛鎴炵懅閸樹粙姊洪棃娑氱畾闁硅櫕宀稿畷鐑筋敇閻樼數鍔堕梺璇插嚱缂嶅棝宕戞担鍦洸婵犲﹤鐗婇悡娑氣偓骞垮劚閸燁偅鎱ㄩ埀顒佺節閵忥綆娼愰柨鏇樺灲瀵鈽夐姀鈥斥偓閿嬨亜韫囨挸顏╂い顐㈡搐閳规垿顢欑涵閿嬫暰濠碉紕鍋犲Λ鍕亱闂佸憡鍔﹂悡浣姐亹閹烘嚦褔鏌涢埄鍐喛濠殿喖娲娲偡閺夋寧些闂佺娅曢敃銏ゆ偘椤曗偓楠炴ḿ鎷犻懠顒夊敽闁诲骸绠嶉崕閬嶅箯鐎n€稑饪伴崼鐔叉嫽闂佺ǹ鏈悷褔藝閿旂晫绡€闁逞屽墴閺屽棗顓奸崨顖ょ吹闂備線娼ч悧鍡浰囬銏犵劦妞ゆ巻鍋撻柛鐔告綑閻g兘宕¢悙鈺傤潔濠碘槅鍨抽崢褔鐛崼銉︹拻濞达絽鎲$拹锟犳煕鎼存稑鈧繈濡撮崘顔煎耿婵炴垶鐟ユ禍妤呮⒑閸濆嫭鍌ㄩ柛銊︽そ閹€斥槈閵忥紕鍘遍梺闈涱檧缁蹭粙宕濆顑芥斀闁挎稑瀚敮鍫曟婢跺绡€濠电姴鍊搁顐︽煟椤撶儐鍎旈柡灞炬礋瀹曟儼顦叉い蹇e墰缁辨帡鎮╁畷鍥ㄥ垱闂佽桨鐒﹂崝娆忕暦閵娾晩鏁囬柣妯虹仛缂嶄線姊婚崒姘偓椋庣矆娓氣偓楠炴牠顢曢敐鍛獮闂佹悶鍎洪崜娆撴倿閸偁浜滈柟鍝勬娴滃墽绱掗崜褑妾搁柛娆忓暙椤曪綁骞庨挊澶婅€垮┑鐐村灦閻熴儵鍩€椤掑倹鏆柡灞诲妼閳规垿宕卞☉鎵佸亾濡も偓椤儻顦遍柛妤佸▕瀵鏁撻悩鎻掕€垮┑鐐叉缁诲棝寮搁崨瀛樷拺闁告繂瀚ḿ銈夋煕閺囥劌浜介柛銈冨€曢埞鎴︽倷閸欏妫¢梺鎼炲妿閺佽鐣烽崫鍕殕闁告洦鍏橀幏娲⒒閸屾氨澧涚紒瀣浮钘熼柣鎰劋閸嬨劍銇勯弽銊р槈婵炴惌鍣i弻銊モ攽閸繀绮堕梺瀹狀潐閸ㄥ綊鍩€椤掑﹦绉甸柛瀣缁傚秴螖閸涱喚鍘甸梺鐓庢贡婢ф銇愯缁辨帡骞撻幒瀣划闂佽鍠曠划娆撳箠閿熺姴围闁搞儮鏅槐鍐测攽閻愯埖褰х紓宥佸亾濡炪倖娲橀悧鏇㈠煝閹捐鍗抽柕蹇ョ磿閸橀亶姊洪棃娴ㄥ綊宕曢搹顐ゎ浄闁靛緵棰佺盎濡炪倖鍔戦崹鑽ょ不瀹曞洨纾奸弶鍫涘妼缁楁帡鎽堕敐澶嬪仯闁搞儜鍕ㄦ灆闂侀€炲苯澧柟绋垮⒔濡叉劙骞樼€涙ê顎撻梺闈╁瘜閸樼ǹ危閸繍娓婚柕鍫濇閻忋儵鏌熼崘鏌ュ弰闁糕斂鍨介獮妯好虹紒妯绘珝闂備胶绮崝蹇涘疾濠婂牆妫橀柍褜鍓氭穱濠囨倷椤忓嫧鍋撻弽褜娼栫憸鐗堝笒閸戠姴鈹戦悩瀹犲缂佲偓閸屾稏浜滈柟鐑樺灥閳ь剝宕垫竟鏇熺附閸涘﹦鍘藉┑鈽嗗灡鐎笛囨偟椤忓棌鍋撶憴鍕闁活厼鍊垮濠氬即閵忕姴鑰块梺鍝勬川婵厼危椤旂⒈娓婚柕鍫濋娴滄繄绱掔拠鑼ⅵ闁绘侗鍣e畷鍫曞Ω閿曗偓椤庢捇姊虹粙璺ㄧ妞わ缚鍗抽幃妤呭川婵犲嫮鐦堥梺姹囧灲濞佳冩毄闂備浇妗ㄧ粈渚€骞夐敓鐘茬疄闁靛ň鏅╅弫鍥煏韫囨洖啸闁挎稒鐩铏规喆閸曨偆顦ㄧ紓浣割樈閸犳盯濡甸幇鏉跨闁规儳鐡ㄩ悵鎶芥⒒娴h鍋犻柛搴櫍瀵剟宕掗悙鑼姦濡炪倖宸婚崑鎾绘煥閺囥劋閭€殿喖顭烽弫鎾绘偐閼碱剙濮︽俊鐐€栫敮濠囨嚄閸洏鈧懘鎮滈懞銉モ偓鐢告煥濠靛棝顎楀ù婊呭仱閺屾稑螣閹稿寒妫勯梺瀹狀潐閸ㄥ潡宕洪妷鈺佸耿婵°倕鍟╅悽缁樹繆閻愵亜鈧牠宕归崼鏇熷仭闁宠桨鑳堕弳锕傛煟閵忋埄鏆柛瀣崌閺佹劖鎯旈垾鍐茬闂備胶枪椤戝棝骞愭ィ鍐ㄧ疅闁圭虎鍠栫粈瀣亜閹哄棗浜炬繛瀵稿Л閺呯姴顫忛搹鍦煓闁圭ǹ楠搁弨顓犵磽娓氬洤娅嶇紒鐘崇墵楠炲啫顫滈埀顒€鐣峰鈧、娆戞喆閿濆棗顏圭紓鍌氬€搁崐鐑芥倿閿曞倸鐓熼柕鍫濐樈閺佸倿鏌涢弴銏℃锭婵炲牄鍔戝娲礈閹绘帊绨煎┑鐐插级閻楃娀骞冮崸妤婃晪闁逞屽墴瀵鏁愭径濠勭杸濡炪倖妫佹慨銈呅掗崟顓犵<闁绘劦鍓欓崝銈夋煏閸喐鍊愮€殿喛顕ч埥澶婎潩椤愶絽濯伴梻浣虹帛閸旓箓宕滃☉妯锋灁闁靛牆顦伴悡娑樏归敐鍛喐濠⒀嶇畵閺岀喖顢欑粵瀣暭闂佺懓寮堕幐鍐茬暦閻旂⒈鏁嗛柛灞诲€栬ⅷ缂傚倸鍊搁崐椋庢閿熺姴绐楅柡宥庡亝瀹曞弶淇婇娑橆嚋妞ゃ儯鍊濆铏规嫚閺屻儱寮板┑鐐板尃閸パ咁啈濠电姴锕ら崥妯衡槈閵忊晜鏅梺缁樺姇椤曨參宕㈤棃娑辨富闁靛牆妫涙晶顏呬繆椤愶絾鈷掔紒顔肩墛閹峰懘宕烽褎绁俊鐐€栧ú宥夊磻閹剧粯鐓欐い鏃傜摂濞堟棃鏌嶇紒妯诲磳鐎规洖缍婇、娆撴偩鐏炲ジ鍋楅梻鍌氬€烽懗鍓佸垝椤栫偞鍋嬫繝濠傜墕閸屻劎鎲搁弮鍫濈畺濡わ絽鍟崐濠氭煠閹帒鍔氬ù婊勵殜閺岀喖鎮℃惔锝嗘喖闁藉啳椴搁妵鍕敃閵忊懣銏ゆ煃鐟欏嫬鐏撮柛鈹垮劦瀹曞崬螖閸愌勫煕闂備浇宕垫慨顓㈠磻閹剧粯鐓ラ柡鍥╁仜閳ь剙缍婂畷鎰版偨绾版ê浜鹃悷娆忓缁€鈧┑鐐茬湴閸斿孩绔熼弴鐔侯浄閻庯綆鍋嗛崢閬嶆煟韫囨洖浠滃褌绮欓獮濠囧川鐎涙ḿ鍘遍梺鍝勫€藉▔鏇熺墡闂備線娼уú銈団偓姘卞娣囧﹪骞栨担鑲濄劑鏌ㄩ弮鍌滃笡妞ゃ儻缍佸缁樻媴妞嬪簼瑕嗙紓浣瑰絻婢т粙骞戦姀銈呴唶闁靛/鍐偊闂備礁鎼粔鏌ュ礉瀹ュ棗鍨旈悗娑櫳戦崣蹇旂節闂堟稒顥炴繝鈧导瀛樼厵闂婎偒鍘煎畵鍡樻叏婵犲嫮甯涢柟宄版嚇閹煎綊鎮烽幍顕呭仹濠电姷顣藉Σ鍛村磻閸曨垰鐤痪鎯ь儐閿涘倿姊绘担绛嬫綈鐎规洘锕㈤、姘愁槻閺佸牓鏌$仦璇插姕闁稿﹦鏁婚弻銊モ攽閸℃侗鈧鏌$€n剙鏋涢柡宀嬬秮楠炴ḿ鎹勯悜妯尖偓鐐箾閿濆懏鎼愰柨鏇ㄤ簼娣囧﹪宕奸弴鐐碉紲濠殿喗锕╅崑鍕夊鑸碘拻闁稿本鐟ㄩ崗宀€绱掗鍛仸闁靛棗鍟村畷銊╊敇閸ャ劎鈽夐摶鏍煕濞戝崬骞橀柛妯绘そ濮婃椽宕烽鐐板缂備礁澧庨崑銈咁嚕椤曗偓瀹曠厧鈹戦崱娆戝春濠碉紕鍋戦崐鏍涙笟鈧敐鐐村緞鐏炵ǹ浜炬慨姗嗗厵閸嬨垺鎱ㄦ繝鍐┿仢闁圭绻濇俊鍫曞川閸涱偄鐏紒缁樼洴閹崇娀顢楅埀顒勫煝閸儲鐓曢柍瑙勫劤娴滅偓淇婇悙顏勨偓鏍暜閹烘鐤い鏍仦閸嬬喐銇勮箛鎾跺闁绘挾鍠栭悡顐﹀炊瑜濆銉ッ瑰⿰鍫㈢暫婵﹤顭峰畷鎺戭潩椤戣棄浜惧瀣捣閻棗銆掑锝呬壕濡ょ姷鍋為悧鐘汇€侀弴銏℃櫇闁逞屽墰缁鎮╃紒妯煎幍闂備緡鍙忕粻鎴︾嵁濡ゅ懏鐓曟繛鍡楃箳缁犲鏌″畝鈧崰鎾舵閹烘顫呴柣妯虹-娴滃爼姊绘担鍛靛綊顢栭崒鐐茬柧闁绘ǹ顕ч拑鐔兼煥濠靛棭妲搁崶鎾煙閼圭増褰х紒杈ㄦ礃缁傛帒饪伴崟顓狀啎闁诲孩绋掑玻鍧楁儗婵犲嫮纾界€广儱鎷戦煬顒傗偓娈垮枛椤兘骞冮姀銈呯闁绘挸绨堕崑鎾剁磼濡湱绠氬銈嗙墬缁诲倹绂嶈ぐ鎺撶厽闁挎繂妫欓妵婵囨叏婵犲啯銇濈€规洦鍋婂畷鐔碱敆閳ь剙鈻嶉妶鍥╃=濞达絿鐡旈崵娆撴煟濡も偓濡繈鏁愰悙鍓佺杸闁瑰彞鐒﹀浠嬨€侀弮鍫濇そ濞达綀顕栧Λ鍐ㄢ攽閻樺灚鏆╅柛瀣仱瀹曞綊宕奸弴鐔锋疄婵°倧绲介崯銊╁焵椤掆偓閸婂灝鐣烽锕€绀嬮柕濠忛檮閺夋悂姊绘担鍝ユ瀮婵☆偄瀚灋婵°倓鑳堕々鍙夌節闂堟侗鍎愰柣鎾跺枛閺岋綁寮崹顔鹃獓濠电偛鎳庨敃顏堝蓟閺囥垹骞㈤柡鍥╁濡差噣姊虹€圭媭鍤欓梺甯秮閻涱噣骞掑Δ鈧猾宥夋煕鐏炲墽鈯曠紒棰濆亰濮婂宕掑▎鎴М闂佸湱鈷堥崑濠傜暦椤栫儐鏁冮柨鏇楀亾缁惧墽鎳撻埞鎴︽偐瀹曞浂鏆¢梺绋块閿曨亪寮诲☉銏╂晝闁绘ɑ褰冩慨鏇㈡⒑閹惰姤鏁遍柛銊ョ埣楠炲牓濡搁埡鍌氫画闂佺粯顨呴悧濠囧箖濞嗘挻鈷戦悹鍥皺缁犳壆鈧鍠栨晶搴ㄥ箲閵忕姭妲堟繛鍡樺姇椤庢捇姊洪崨濠傚鐟滄澘鍟撮、鏃堫敃閿濆啩绨婚梺鍐叉惈閸燁偊宕㈤幘顔界厸閻忕偠顕ф慨鍌溾偓娈垮枟閹告娊骞冨▎寰濆湱鈧綆浜欐竟鏇㈡偡濠婂懎顣奸悽顖涱殜瀹曟垿宕掗悙瀵稿幐闂佹悶鍎崕閬嶆倶椤忓牊鐓熼柟鎯х-缁犱即鏌嶇憴鍕伌闁诡喗鐟╅幊鐘活敄閼愁垱顎楅梻鍌欑閹诧繝寮婚敐澶婄9婵犻潧顑呴拑鐔哥箾閹存瑥鐏╅柣鎾寸洴閹鏁愭惔鈥愁潾闁藉啳椴告穱濠囨倷椤忓嫧鍋撻幋锕€绀夊┑鐘叉搐绾惧潡鏌i姀鈶跺湱绮婚弽銊х闁糕剝蓱鐏忣厾绱掗悪娆忔处閻撴瑩鎮楀☉娆嬬細缂佺姰鍎茬换娑㈠礂閼测晩鏆℃繛锝呮搐閿曨亝淇婇崼鏇炵倞妞ゎ剦鍠撻崕鐢稿蓟濞戞埃鍋撻敐搴″濞寸娀浜堕弻鈩冩媴缁嬫寧娈绘繝娈垮枓閸嬫捇姊洪棃娑氬闁哥喓濞€瀹曟垿骞樼€涙ê顎撶紓渚囧灡濞叉﹢鎮楁繝姘拺闁革富鍘兼禍鐐箾閸忚偐鎳冮柍缁樻崌楠炲洭鎮ч崼姘闂備礁鎲¢崝鏇烆嚕閸洖绠氶柛顐ゅ枂娴滄粓鏌熺€涙ḿ绠栭柛鐘筹耿閺岋絽鈽夐崡鐐寸彎婵犳鍠掗崑鎾绘⒑闂堟稓澧曟俊顐㈢焸楠炲繑绻濆顓涙嫼缂備礁顑嗙€笛冿耿娴煎瓨鐓熼柣鏇炲€搁々顒傜磼椤旂》韬柟顔ㄥ洤閱囨繛鎴烆殘閻╁孩淇婇悙顏勨偓鏍礉閹达箑鏄ラ柛鏇ㄥ€犻敐澶婄濞达絽婀遍崢浠嬫⒑閹稿海绠撻柟鍐查鍗卞┑鐘崇閹虫岸鏌ㄥ┑鍡╂Ч闁绘挾濮电换娑㈠级閹搭厼鍓卞┑鐐叉噹濞差參寮婚敐澶婄闁归绀侀崜鏉款渻閵堝簼绨婚柛鐔风摠娣囧﹪宕奸弴鐐茶€垮┑顔筋殔濡瑩鍩涢弽顓熲拻濞达綀濮ょ涵鍫曟煕閻樺弶顥㈢€规洘娲熼幊鐘活敆閸屾粎鍔归柣搴$畭閸庨亶鎮ч崟顒傤洸鐟滅増甯楅悡娆撴煟閹寸倖鎴犱焊閻㈠憡鐓曟俊顖氬悑閺嗩剚鎱ㄦ繝鍛仩缂佽鲸甯掕灒闁惧繘鈧稒顢橀梻浣芥閸熷瓨绂嶉崼鏇炵畺婵☆垵娉曢悿鈧梺鎸庣箓閹冲海绮昏ぐ鎺撯拻闁搞儜灞拘х紓浣虹帛缁诲啰鎹㈠┑瀣<婵﹩鍘介宥囩磽閸屾瑧顦︽い锕備憾瀹曟洟濡舵径濠勭杽闂侀潧饪垫俊鍥╁姬閳ь剟姊洪崨濠佺繁闁革綆鍠楃粋鎺楀煛閸愵亞锛濇繛杈剧导缁瑩宕ú顏呭仺妞ゆ牗绋戠粭鈺呮煟韫囨柨娴慨濠冩そ楠炲棜顦寸紒鐘差煼閺屽秷顧侀柛鎾存皑缁瑩骞掑灏栧亾娴e壊娼ㄩ柍褜鍓欓~蹇旂節濮橆剛锛滃┑鐐叉閸ㄥ灚淇婃禒瀣厽閹艰揪绲块幊妤呮煕韫囨洖孝闁圭⒈鍋婇、姗€宕楅悡搴g獮婵犵數濮寸€氼參鎮¢敐鍡欑瘈闁汇垽娼ф禒锕傛煕閵娿儱顣抽柛鎺撳笚閹棃濮€閵忊晜閿ら梻鍌欑贰閸撴瑧绮旈悽绋跨厱闁圭儤鍤氳ぐ鎺撴櫜闁告侗鍠栭弳鍫ユ⒑閸濄儱鏋旈柛瀣仧閹广垹鈽夊顓炵彴閻熸粌绻橀幃楣冩偨绾版ê浜鹃悷娆忓缁€鈧紓鍌氱Т閿曨亜顕f繝姘耿婵°倕锕ら幃鎴︽⒑閸涘﹣绶遍柛銊ゅ嵆閻涱噣宕奸妷锔规嫽婵炶揪绲肩拃锕傚绩娴煎瓨鐓欐繛鑼额唺闁垱鎱ㄦ繝浣虹煓鐎规洜鍠栭、娑樷槈濡湱鏆楀┑鐘垫暩閸嬫稑螞濞嗘挸绠板┑鐘崇閸嬪倿鏌eΟ铏癸紞缂佺娀绠栭弻鈩冨緞鐎n亞鍔搁梺绋垮閸旀牜鎹㈠☉銏犲窛妞ゆ挾鍠庡▍锝夋⒒閸パ屾█闁哄矉绲借灒闁惧繒娅㈢槐鐐烘⒑濞茶骞栭柨鏇ㄤ邯瀵顓奸崶銊ユ瀭闂佸憡娲﹂崑鍡樺瀹€鍕拺闁硅偐鍋涙慨鍌滅磼閻樺磭澧垫鐐插暙閳诲酣骞橀弶鎴犳濠电姰鍨煎▔娑⑺囬鐐插瀭婵犻潧顑嗛埛鎺楁煕鐏炲墽鎳勭紒浣哄閵囧嫰寮撮悢鍝勨拰閻庤娲樺妯跨亙闂佸憡渚楅崑鈧柛瀣崌瀹曟﹢顢欓悡搴g崺闂備礁鎼ˇ浼村垂瑜版帒鐭楅柍褜鍓欓埞鎴︽偐椤旇偐浼囬梺绯曟櫆閻楃姴鐣峰┑瀣嵆闁绘ê鍚€缁楀姊虹憴鍕姸濠殿喓鍊濋幃鈥斥枎閹惧鍘靛銈嗙墪濡鎳熼姘f灁闁割偅娲橀崑鈩冪節婵犲倸顏紒璺哄级缁绘稓浠﹂崒姘瀷濠碘€冲级閸旀瑩鐛Ο鍏煎珰闁肩⒈鍓ㄧ槐鍙夌節閻㈤潧浠滄俊顐g懇瀹曞綊鎳栭埡鍐箵濠德板€曢幊蹇涘煕閹达附鐓曟繝闈涘閸旀岸寮介敓鐘斥拺缂備焦锕╁▓妯衡攽閻愨晛浜鹃梻渚€娼уΛ鏃傛濮橆剦鍤曞ù鐘差儛閺佸洭鏌i幇顖氱毢闁绘稈鏅犲缁樻媴閸涘﹨纭€闂佸啿鍢查悧鎾崇暦閵忥紕顩烽悗锝庝簽閺屟囨⒑閹稿海绠撴い锔垮嵆閸╂盯骞嬮悩鐢碉紲闁诲函缍嗛崢鐣屾兜閸撲胶纾奸柣妯哄暱閳绘洟鏌$仦鍓р槈閾伙綁鏌eΟ鍝勭骇闁革絿鍎ら妵鍕箛椤忓棛鐓撻梺鍝勭焿缂嶄線鐛崶顒夋晩闁告挆鍛潓缂傚倸鍊峰ù鍥敋瑜嶈灋婵炲棙鎸告闂佸憡娲﹂崹浼村礃閳ь剟姊洪棃娴ゆ盯宕ㄩ姘瑩闂傚倷鐒﹂惇褰掑春閸曨垰鍨傞弶鍫氭櫇閻瑩鏌熼悜妯烩拹鐎规洖寮剁换娑㈠箣濞嗗繒浠奸悗鐟版啞缁诲啴濡甸崟顖氱閻犺櫣鍎ら悗濠氭⒑閸濆嫷鍎戝┑顔芥尦閸╃偤骞嬮敂缁樻櫓缂佺虎鍘奸崲鍙夋叏濞戞氨纾藉〒姘搐濞呮﹢鏌涢妸銉у煟闁绘侗鍠涚粻娑樷槈濡櫣鐛╅梺璇插缁嬫帡鏁嬫繛瀵稿閸欏啫顫忕紒妯肩懝闁搞儜鍐х礋缂傚倷鑳舵慨鐢稿垂閻㈢ǹ鐓濋柟鐐灱閺€浠嬫煕椤愮姴鐏柨娑欑箞濮婅櫣绮欓幐搴㈡嫳闂佽崵鍣︽俊鍥╁垝婵犲洦鍋嬮柛顐g◥缁ㄥ姊洪崫鍕悙婵☆偅顨呯叅闁靛牆娲らˉ姘辨喐閻楀牆绗氶柣鎾存礃閵囧嫰顢橀悢椋庝淮濠电偛鎳忛敃銏ゅ蓟濞戙垹围闁糕剝岣块ˇ顓犵磽娴d粙鍝洪柟绋款煼楠炲繘宕ㄩ娑橆伕濡炪倖鐗楃划搴g玻濡ゅ啰纾介柛灞剧懆椤斿淇婇悪娆忔搐绾惧鏌熼崜褏甯涢柍閿嬪笒闇夐柨婵嗙墱濞兼劙鏌涚€n剙鈻堥柡灞剧⊕閹棃顢欓懖鈺€妗撻柣搴ゎ潐濞叉ḿ鎹㈤崒鐑嗘晣濠靛倻枪瀹告繃銇勮箛鎾村櫧闁逞屽墯濡炶棄顫忓ú顏勭闁绘劖褰冩慨鍫曟⒑閸涘﹥灏扮€光偓閹间礁鏄ユ繛鎴欏灩缁狅綁鏌eΟ鍏兼毄闁挎稒绮撻弻锝嗘償椤栨粎校闂佺ǹ顑呯€氫即銆佸顑藉牚闁告洦鍘鹃惁鍫ユ⒑闁偛鑻晶瀛橆殽閻愯尙效妞ゃ垺鐟╁畷婊嗩檪缂佽鲸鐓″铏规嫚閹绘帒姣愮紓鍌氱Т濡繂鐣烽幋锕€宸濇い鎾跺У濞堥箖鎮楅崗澶婁壕闂侀€炲苯澧撮柛鈹惧亾濡炪倖甯掗崰姘缚閹邦厾绠鹃柟缁樺笧缁犺崵鈧娲濋~澶岀矉閹烘柡鍋撻敐搴濈敖闁伙絿鍎ょ换娑氣偓鐢登瑰瓭濡炪倖鍨甸幊搴敊韫囨挴鏀介柛鈥崇箲閺傗偓闂備胶绮摫鐟滄澘鍟撮、鏃堝煛閸屻倖顔旈梺缁樺姈閹苯鈻撳⿰鍕弿濠电姴鍟妵婵嬫煙椤旀儳鍘寸€殿喖鐖奸獮鎰償閳锯偓閸嬫捇顢涢悙绮规嫼婵炴潙鍚嬮悷褏绮旈棃娴㈢懓饪版惔婵堢泿闂佷紮缍侀ˉ鎾诲箟閹绢喖绀嬫い鎾跺Х濡插洦绻濆▓鍨灍闁挎洍鏅犲畷婊冣槈閵忕姴鍋嶉梺瑙勫婢ф鍩涢幋锔界厱婵犻潧妫楅顏堟煕鐏炶濮傞柡灞剧洴婵℃悂鏁傛慨鎰檸闂備浇顕栭崳顖滄崲濠靛洣绻嗛柣鎴eГ閺呮粓鏌﹀Ο渚Ц濞寸厧瀛╃换婵堝枈濡椿娼戦梺鎼炲妺閸楁娊骞冨Ο琛℃斀閻庯綆鍋勬禍妤呮⒑鐟欏嫬顥嬪褎顨婇幃锟犳偄閸忚偐鍘甸梺纭咁潐閸旀牜娑垫ィ鍐╃厸閻庯綆鍋嗗ú鎾煛瀹€瀣М妤犵偞鐟╁畷姗€濡搁妶鍛€抽梺璇叉唉椤煤閺嶎厽鍋夐柛蹇涙?缁诲棝鏌i幋锝嗩棄閸烆垶姊洪棃娑辨Ф闁稿孩鐩獮瀣偐閻㈢绱抽梻浣呵归張顒勬偡瑜旇棟闁挎柨顫曟禍婊堟煙鐎涙ḿ绠樺褎娲熼弻锝夋晲閸パ冨箣闂佽鍠曠划娆忕暦瑜版帩鏁冩い鎰剁悼缁嬫劙姊婚崒娆戭槮婵犫偓闁秴纾块柕鍫濇媼濞兼牠鏌ゆ慨鎰偓鏇⑺夊鑸电厱闊洦绋掗敍鐔虹磼鐠囧弶顥為柕鍥у瀵粙濡歌閻e灚绻涚€涙ḿ鐭婄紓宥咃躬瀵鏁愭径瀣珳闂佸壊鍋嗛崳銉︾閳哄啰纾藉ù锝勭矙閸濇椽鏌熺粙娆剧吋妤犵偛绻樺畷銊р偓娑櫳戦崕顏堟⒑閼姐倕鏋戝鐟版椤㈡洟鎳栭埡鍐紳闂佺ǹ鏈悷锔剧矈閻楀牄浜滈柡鍥ф濞诧箓宕戠€n喗鐓曢柍鈺佸暟閳洟鏌涚€Q勬珖闁逞屽墰閹虫挾鈧矮鍗冲畷鎴炵節閸屾牜绱伴梺闈浥堥弲婊堟偂閸愵亝鍠愭繝濠傜墕缁€鍫熸叏濮楀棗骞橀柍鐟扮Т閳规垿鎮╅幓鎺嶇敖濠电偛鍚嬫竟鍡涘焵椤掆偓閸樻粓宕戦幘鏂ユ斀闁绘ɑ褰冮弫顏堟煏婵炑冩噽閿涙繈姊虹粙鎸庢拱闁荤噦濡囩划濠囧级濞嗙偓瀵岄梺鍝勵槹閸ㄥ爼骞夐幖浣圭厵妤犵偛鐏濋悘鑼偓瑙勬礈閸樠囧煘閹达箑绠涙い鎾跺Х閳诲绱撻崒姘偓鎼佸磹閻戣姤鍊块柨鏇氱劍閹冲苯鈹戦悩鎰佸晱闁搞劋鍗抽、姘额敇閻樻剚娼熼梺鍦劋閸ㄧ喎危閸喐鍙忔俊銈傚亾婵☆偅顨婂畷婊堝级鎼存挻鏂€闂佺粯鍔樼亸娆愭櫠濞戙垺鐓曢柡鍐e亾闁荤喆鍎甸敐鐐剁疀閹句焦妞介、鏃堝礋椤撗冩櫍闂傚倷鑳剁划顖炲礉閺嶎兙浜归柛鎰靛枓閳ь剚鐗犲畷鍗炩槈濞嗗本瀚奸梻浣告啞缁嬫垿銈弶鎴旀灁闁哄啫鐗婇悡鏇㈡煟閺冨牊鏁遍柛瀣ㄥ劦閺岀喖顢氶埀顒傜不閺嶎厼绠栨繝濠傛噽妞规娊鎮楅敐搴′簼婵炲懏鐗犲缁樻媴閾忕懓绗¢梺鍛婃⒐宀f寧绂嶇粙搴撴瀻闁规澘鐏氶鏃堟⒑閹肩偛鍔撮柛鎾村哺閸╂盯骞嬮敂鐣屽幗闂佺粯姊婚崢褎绂嶆导瀛樼厱闁靛牆娲ら弸搴ㄦ煃鐟欏嫬鐏存い銏″哺閸┾偓妞ゆ巻鍋撳畝锝堝劵椤﹀綊鏌涢埞鍨伈妤犵偞锚鑿愭い鎺嗗亾濞存粍绻堝娲川婵犲倸顫呴梺鍝勫€风欢姘剁嵁韫囨稒鎯為柛锔诲幘閿涙繈姊虹粙鎸庢拱闁荤啙鍥х鐎广儱顦扮€氬懘姊洪鈧粔鐢告偂閸愵喗鈷戦柛顭戝櫘閸庡繑绻涢幖顓炴珝闁哄矉绱曟禒锕傛偩鐏炴縿鍨介弻锝夋晲韫囨洜鐦堝Δ鐘靛仜缁夊綊銆佸▎鎴滅剨闁哄诞鍐榾闂傚倷娴囬褏鈧稈鏅犻、娆撳冀椤撶偤妫峰銈嗘磵閸嬫挾鈧娲橀崹鍓佹崲濠靛纾兼繝濠傚椤旀洟姊绘担鍛婅础闁稿簺鍊濋妴鍐幢濞戞ḿ锛欓梺缁樺灱婵倝宕愰悽鍛婄厽闁靛繈鍨洪銏㈡喐閻楀牆绗х€规挷绶氶弻娑㈩敃閻樻彃濮曢梺鎶芥敱鐢帡婀侀梺鎸庣箓濞诧箓宕甸埀顒勬⒑瀹曞洨甯涙繛鑼枛瀵鍩勯崘顏嗘嚌闂佹悶鍎滈崟顓炵秵闂佽姘﹂~澶娒哄鈧畷褰掑锤濡ゅ啫绁﹀┑鈽嗗灥閸嬫劗澹曢崗闂寸箚妞ゆ牗绮岀敮鑸殿殽閻愭潙濮嶆慨濠勭帛閹峰懘宕ㄦ繝鍌涙畼濠电偞鎸荤喊宥夈€冩繝鍌滄殾闁哄顑欏ḿ鈺呮偣妤︽寧顏犻柣銈呮喘濮婃椽宕ㄦ繝浣虹箒闂佸摜濮靛ú婊堝箲閵忋倕骞㈡繛鎴炵懅閸樺崬鈹戦悙鍙夘棞婵炲瓨鑹惧嵄缂佸绨遍弨鑺ャ亜閺傚灝鎮戦柛鐘筹耿閺岀喖鎸婃径灞界厽闂佽桨鐒﹂崝鏍ь嚗閸曨厸鍋撻敐搴濈胺闁告繃顨嗙换婵嬫偨闂堟稐娌梺鎼炲妼婢у酣寮鈧獮鎺楀箻鐎涙ḿ褰块梻浣告惈鐞氼偊宕曢弻銉﹀亗婵炴垯鍨洪悡鏇㈡倶閻愪絻妾告繛鍫熸煥闇夋繝濠傜墢閻g儤鎱ㄦ繝鍌ょ吋鐎规洘甯掗~婵嬵敄閽樺澹曢梺缁樺灱婵倝宕甸崟顖涚厱闁规崘灏欓ˇ锕傛煕閵婏妇绠栭柕鍥у瀵粙顢曢~顓犳崟缂傚倷璁查崑鎾愁熆閼搁潧濮堥柣鎾寸洴閺屾盯濡烽姀鈩冪彅闂侀€炲苯澧剧紓宥勭窔楠炲啴濮€閵堝懍绱堕梺闈涳紡閸涱噮娼撻梻鍌氬€烽悞锕傚箖閸洖纾挎繝濠傜墕缁€鍐煃鏉炴壆顦﹀┑顔煎暣濮婂宕掑顑藉亾閻戣姤鍤勯柛鎾茬閸ㄦ繃銇勯弽顐粶闁藉啰鍠栭弻鏇熺箾閻愵剚鐝曢梺绋块缁夌數鎹㈠┑瀣棃婵炴垵宕崜鎵磽閸屾瑨顔夐柡鍛█瀵濡舵径濠勭暢闂佸湱鍎ら崹鍨叏鐏炲墽绠鹃悗娑欋缚閻绱掗鑺ュ磳鐎殿喖顭烽弫鎾绘偐閼碱剦妲伴梻渚€娼чオ鐢电不閹次诲洭鍩℃笟鍥ㄥ瘜闂侀潧鐗嗛崯顐﹀礉濮橆厹浜滈柨鏃傚亾閺嗩剛鈧鍠涢褔鍩ユ径鎰潊闁绘ɑ鍓氬Λ鐔兼⒑閼姐倕孝婵炶濡囩划濠囧箻椤旇偐锛涢梺鍦亾閺嬪ジ寮ㄦ禒瀣€甸柨婵嗙凹缁ㄨ姤銇勯弮鈧崹鍨潖濞差亜绀堥柟缁樺笂缁ㄧ厧鈹戦悙鎻掔骇闁挎洏鍨归悾鐑藉箛閻楀牆鈧鏌ら幁鎺戝姢闁告ü绮欏娲偡闁箑娈堕梺绋款儏缁夊墎妲愰幘鎰佹僵闁煎摜鏁搁崢鍗炩攽椤斿浠滈柛瀣尭闇夋繝濠傛绾偓銇勯銏㈢閻撱倖銇勮箛鎾愁仹缂佸崬鐖煎娲川婵犲啫顦╅梺鍛婃尰閻熲晛鐣烽幋婵愬悑濠㈣泛顑傞幏娲⒑閸涘﹦鈽夐柨鏇樺劦閹繝濡烽埡鍌滃幐闂佸壊鍋掗崑鍕櫠鐎电硶鍋撳▓鍨灍闁绘挴鈧磭鏆﹀┑鍌溓归崡鎶芥煏婵犲繘妾繛鍛墵濮婄粯鎷呴搹鐟扮闂佸憡姊瑰ú鐔笺€佸棰濇晣闁靛繒濮撮崑宥夋⒑閸涘⿴娈橀柛瀣姍瀵劍绂掔€n偆鍘介梺褰掑亰閸撴瑧鐥閵囧嫰濡烽敂鍓х厒缂備浇椴哥敮鐐垫閹烘嚦鐔兼惞鐠団€冲壃缂傚倸鍊风欢锟犲窗濮樺崬鍨濇い鏍ㄧ矋瀹曞弶绻濋棃娑欙紞婵炲皷鏅滈妵鍕箻鐠虹洅銏☆殽閻愭潙濮嶆慨濠呮閹风娀鎳犻鍌ゅ敽闂備胶枪椤戝洭宕伴弽褜鍤曢柡灞诲労閺佸啴鏌ㄥ┑鍡橆棡闁绘繐绻濆缁樻媴缁涘娈┑顔斤公缁犳捇鏁愰悙鏉戠窞濠电偞甯楀浠嬪极閸愵喖纾兼慨妯诲敾缁卞崬鈹戦悩鍨毄濠殿喗鎸冲畷鎰節濮橆剚杈堥梺鎸庢礀閸婂綊鎮¢悢鍏肩厸闁告劑鍔岄埀顒傛暬楠炲繘鏁撻悩宕囧幐婵炶揪绲介幉锟犓夐姀銈嗙厸閻忕偟鏅暩濡炪伇鍌滅獢闁哄本鐩獮妯尖偓闈涙啞閸d即姊虹化鏇熸澓闁搞劌缍婇、姗€宕楅悡搴g獮闁诲函缍嗛崑鍛存偟閹惰姤鈷掑ù锝堫潐閸嬬娀鏌涙惔顔兼珝鐎殿喗褰冮埞鎴犫偓锝庡亝濞呮牕鈹戦悩缁樻锭婵炲眰鍔庣划缁樸偅閸愩劎楠囬梺鍓插亝缁诲倿鍩涢弮鍌滅<閻庯綆鍘奸崥褰掓煙閸欏鍊愮€殿喖鐖煎畷褰掝敊閼恒儺鍞圭紓鍌氬€风粈渚€宕愰崫銉х煋鐟滅増甯掔粻鏍ㄧ箾閸℃ɑ鎯勯柡浣告閺屾稓浠﹂崜褏鐓傚┑鈩冨絻濞差厼顫忕紒妯肩懝闁逞屽墮宀h儻顦虫い銊e劥缁犳盯寮撮悙鐢电摌闂備礁鎲¢幐鍡涘礋椤愩垹绠查梻鍌欒兌缁垶宕濋敃鍌氱婵炲棙鍔楅々鍙夌節婵犲倻澧涢柣鎾寸懇閹鈽夊▎瀣窗缂備胶濮甸悧婊堝焵椤掑倹鍤€闁硅绱曢幑銏ゅ礋椤撶噥娼熼梺鍦劋椤ㄥ繘寮繝鍥ㄧ厱闁圭偓顨呴崯浼搭敃婵傚憡鈷掑〒姘e亾婵炰匠鍥ㄥ亱闁绘劗鏁哥粈濠偯归敐鍛喐闁哄棴闄勯幈銊ヮ渻鐠囪弓澹曢梻浣虹《閺咁亞鎹㈠┑鍡欐殾婵せ鍋撳┑鈩冩倐婵$柉顧侀柛姘儔濮婂宕掑顑藉亾瀹勬噴褰掑炊椤掑鏅悷婊冪箻閸┾偓妞ゆ帊鑳堕埢鎾绘煛閸涱喚绠橀柛鎺撳笒閳诲酣骞樺畷鍥跺敽闂備胶鎳撻顓熸叏鐎靛摜涓嶉柣銏犳啞閻撶喖鏌eΟ鍝勫笭闁煎壊浜弻娑㈠棘閸噮鍔夌紓浣割儏椤︻垶顢樻總绋垮耿婵☆垰鎼导搴㈢節绾板纾块柛瀣█椤㈡俺顦崇紒鍌氱У閵堬綁宕橀埞鐐闂備礁鎲$换鍌溾偓姘煎灦閿濈偤鏁冮崒娑氬幈闂佸搫鍊藉▔鏇㈡倿閹间焦鐓曢柍鐟扮仢閸旀粎鈧灚婢樼€氼厾鎹㈠☉銏狀潊闁靛繒濮甸悗楣冩倵閸偅绶查悗姘嵆楠炲棝宕掗悙韫炊闂侀潧顦介悘鏍箣閿旇В鎷洪梻鍌氱墛缁嬫帡骞栭幇鐗堝€垫慨妯哄船椤g厧菐閸パ嶈含妤犵偞鐗楅幏鍛喆閸曨剛褰搁梻鍌欑閹测剝绗熷Δ鍛偍闁煎綊鍋婇弶娲⒒閸屾艾鈧悂宕愬畡鎳婂綊宕堕澶嬫櫔闂佸搫绋侀崢鑲╃玻濡や椒绻嗛柕鍫濇噺閸f椽鏌涚€e墎绡€闁哄苯绉瑰畷顐﹀礋椤掆偓濞咃繝姊洪柅鐐茶嫰閸樺摜绱掗懜浣冨妞ゆ洩缍侀、姘跺焵椤掆偓閻g兘鎮℃惔妯绘杸闂佸壊鍋掗崑鍛櫏濠电姷顣槐鏇㈠磻閹达箑纾归柡宥庡幖缁犱即鏌ゆ慨鎰偓鏍х暦閺屻儲鐓曢柡鍥ュ妼楠炴﹢鏌i鐐搭棦闁哄本鐩鎾Ω閵壯傜敾闂備焦濞婇弨杈╂暜閿熺姴钃熸繛鎴炵煯濞岊亪鏌涢幘妤€瀚▍妤冪磽閸屾瑦顦烽柤瀹犲煐閺呰泛螖閸涱厙锕傛煕閺囥劌鐏犻柛妤佸▕閺岋綁寮幐搴㈠創闂佸啿鍢查惌鍌炲箖濡ゅ啯鍠嗛柛鏇ㄥ墰閿涙盯姊洪崨濠庢當闁哥喎娼¢、姘舵晲閸℃瑯娴勯柣搴到閻忔岸寮插┑瀣拺闂傚牊绋撴晶鏇熺箾閺夋垵鈧ǹ宓勭紓浣割儏缁ㄩ亶寮ㄦ禒瀣厽婵☆垵娅f禒娑㈡煛閸″繑娅呴柍瑙勫灴椤㈡瑩鎳為妷銉ユ敪闁诲氦顫夊ú姗€宕濋弽顐e床婵犻潧妫ḿ鈺傘亜閹哄秵绁扮紒韬插灲濮婄粯鎷呴悷閭﹀殝濠电偛寮堕悧鐘茬暦閹邦垬浜归柟鐑樻尭娴滄鈹戦悙鍙夘棡闁告梹鍨剁粋宥呪堪閸喓鍘搁悗骞垮劚妤犲憡绂嶅⿰鍏犲綊鎮╁畷鍥╃厐闂傚洤顦扮换婵囩節閸屾稑娅e銈忕悼閸樠嗗絹闂佹悶鍎滃鍫濇儓闂備胶鎳撶壕顓熸叏閻㈠憡鏅柟閭﹀厴閺€浠嬫煕閳╁喛渚涢柛鐐寸叀濮婂宕掑▎鎴М闂佹眹鍊曞ú顓㈡晲閻愭潙绶為柟閭﹀墮閻庮參姊虹粔鍡楀濞堟棃鏌¢崟鈺佸姦闁哄本鐩鎾Ω閵壯傚摋缂傚倷璁查崑鎾绘煕閹伴潧鏋熼柣鎾崇箰閳规垿鎮欓幋婵嗘殲闁革絿鍏橀弻娑氣偓锛扁偓閸嬫捇寮妷锔芥澑闂備焦瀵х粙鎴犫偓姘煎墯缁傚秵绺介崨濠勫幈婵犵數鍋涢悘婵嬪焵椤掍胶绠撻柣锝囧厴婵偓閹烘娊宕戦崨瀛樼厱闁规壋鏅涙俊鎸庛亜锜婚崘锝嗘杸闂佸疇妫勫Λ妤呮倶閻斿吋鍋i柍褜鍓熼弫鍐磼濮橆剚鍎梻浣告惈濞层垽宕瑰ú顏勭;闁挎繂顦伴悡鏇㈡煏婢舵稓鍒板┑鈥虫健閺屾洟宕煎┑鍫熸喖婵烇絽娲ら敃顏堢嵁閹捐绠抽柡鍌氱氨閸欐椽姊绘担鍛婃儓闁哄牜鍓欑叅婵犻潧鐗忔稉宥嗙箾閹存瑥鐏╅柛妤佸▕閺岋綁骞嬪┑鍥舵!缂傚倸绉撮惌鍌氼潖缂佹ɑ濯寸紒瀣濮f劙姊洪崷顓涙嫛闁稿锕悰顔界節閸涱垳鏉稿┑鐐村灦閻熴儲绂嶅Δ鍛棅妞ゆ劑鍨烘径鍕煙鐏忔牗娅婇柟顔哄灲瀹曞崬鈽夊▎蹇庡寲濠德板€ч梽鍕偓绗涘浂鏁傞柣妯烘▕閻斿棛鎲告惔鈭舵椽鎮㈤悡搴ゆ憰濠电偞鍨崹鍦尵瀹ュ鐓冪憸婊堝礈閻旇偐宓侀柟鐗堟緲缁狀噣鏌﹀Ο渚Ъ闁硅姤娲栭埞鎴︽倷閺夋垹浠ч梺鎼炲妿閹虫捁鐏嬪┑鈽嗗灥瀹曠數绮绘ィ鍐╃厱闁斥晛鍟伴幊鍐瑰⿰鍕姢閾绘牠鏌¢崘銊モ偓鑽ゅ娴犲鐓曢悘鐐插⒔閹冲嫮绱掓担瑙勭凡妞ゎ亜鍟伴埀顒佺⊕钃遍柛濠冨姈椤ㄣ儵鎮欓弶鎴濐潔缂備胶绮换鍌烇綖濠靛鏁嗛柛灞诲€曢弫鎼佹⒒閸屾瑧顦﹂柟娴嬪墲缁楃喎螖閸涱厼鐎梺瑙勫劶婵倝宕曞Δ浣虹闁糕剝蓱鐏忣厾绱掗悩鑼Ш闁诡喗顨呴埥澶娾枍閾忣偄鐏╁ù婊勬倐椤㈡﹢鎮橀懡銈嗗殌妤楊亙鍗冲畷濂稿閵忊剝鐦掗梻鍌欑閹碱偊寮甸鍌滅煓闁硅揪绠戦悡姗€鏌熸潏鍓х暠缂佲偓鐎n偁浜滈柟鎵虫櫅閻忊晝鎮鈧濠氬磼濞嗘垵濡藉┑锛勫仜濞尖€崇暦閵忥紕顩烽悗锝庝簽椤斿洦淇婇妶蹇曞埌闁哥噥鍋嗙划濠氭偄閸忚偐鍘甸梻鍌氬€搁顓㈠礉瀹ュ鐓曢悗锝庝憾閸庢棃鏌$仦鍓ф创妞ゃ垺娲熼弫鎰板炊閳哄啯姣夐梻鍌欐祰瀹曠敻宕伴崱娑樼闁瑰瓨绻嶅ḿ鏍ㄧ箾瀹割喕绨诲ù鑲╁█閺屾盯寮撮姀鈩冮敪闂佸憡鎼╅崰姘辨閹惧瓨濯撮柦妯侯槺閸橆偊鎮楅崗澶婁壕缂備礁顑嗛娆撳吹閺囩偐鏀介柣妯虹-椤f煡鏌涚€n亜顏柡宀嬬秮楠炴﹢鎼归锝呴棷婵$偑鍊х€靛矂宕i崘顔肩畺鐎瑰嫭澹嬮崼顏堟煕閹板吀绨芥い鏂匡躬濮婄儤娼幍顔跨獥闂佸摜濮甸悧鐘诲春閵夛箑绶為柟閭﹀墻濞煎﹪姊洪幐搴b槈閻庢凹鍓熼悰顕€骞囬悧鍫氭嫽婵炶揪绲介幉锟犲疮閻愬眰鈧帒顫濋褎鐤侀悗瑙勬礃濠㈡ǹ鐏冮梺鍛婁緱閸橀箖鏁嶅▎鎾粹拺閻熸瑥瀚ˉ瀣熆瑜庨〃濠囧箖閳ユ枼妲堥柕蹇娾偓鏂ュ亾閸洘鐓熼柟浼村亰閺夋椽鏌涢妶鍡欐噧闁宠鍨块、娆撴偂鎼存ê浜鹃柛褎顨呴拑鐔兼煟閺冨倵鎷¢柡浣革躬閺屾稑鈹戦崱妤婁槐闂佺ǹ顑嗛幐鎼佸煘閹达箑骞㈡繛鍡樺姈椤旀洟姊绘担鍛婅础闁稿簺鍊濆畷褰掓偄閼茬尨缍佸畷濂告偄缁嬪灝浼庢繝寰锋澘鈧劙宕戦幘缈犵箚妞ゆ劧绲鹃埛鎺撲繆閸欏濮嶉柡浣规崌閺佹捇鏁撻敓锟� ---闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽弫鎰緞婵犲嫷鍚呴梻浣瑰缁诲倿骞夊☉銏犵缂備焦岣块崢杈ㄧ節閻㈤潧孝闁稿﹤缍婂畷鎴﹀Ψ閳哄倻鍘搁柣蹇曞仩椤曆勬叏閸屾壕鍋撳▓鍨珮闁革綇绲介悾閿嬬附閸涘﹤浜滈梺鍛婄☉楗挳宕崼鏇熲拻闁稿本鐟ㄩ崗宀勫几椤忓懌浜滈柟瀛樼箖椤ャ垺顨ラ悙鏉戝鐎规洘绮忛ˇ鏌ユ煕閵婏妇绠栭柕鍥у楠炴ḿ鎹勬潪鐗堢潖婵犵鍓濊ぐ鍐偋婵犲啰鈹嶅┑鐘叉祩閺佸秵鎱ㄥ鍡楀箺闁稿孩鎸剧槐鎾存媴閸濆嫅顒併亜閺囧棗娲ら悡姗€鏌熸潏楣冩闁稿﹦鍏橀弻娑樷枎韫囷絾孝闂佸搫顑嗛悷锔炬崲濞戞埃鍋撳☉娆嬬細闁活厼顑囩槐鎺楊敊閼恒儱纾冲Δ鐘靛仜閸熸挳宕规ィ鍐ㄦ闁靛瀵屽ḿ鏃堟⒒娓氣偓濞佳勵殽韫囨洘顫曢柡鍥ュ灩閸屻劑鏌涘Δ鍐ㄤ汗闁衡偓娴犲鐓熼柟閭﹀幗缂嶆垿鏌h箛瀣姢闁逞屽墲椤煤閿曞倸绀堥柣鏂垮悑閸嬫ɑ銇勯弬鎸庮潔闁绘梹鍝鸿瀹曞爼鏁傞崜褎鏅ㄩ梻鍌氬€风粈渚€骞栭锕€纾归柛锔诲幐閸嬫挾绮☉妯荤〗濠㈣埖鍔曢~鍛存煃閳轰礁鏆欑€殿喗瀵х换婵嬫偨闂堟刀銏ゆ煙閸愯尙绠绘い銏℃閹晝绱掑Ο鐓庡箥闂備浇宕甸崰鎰熆濮椻偓椤㈡棃顢橀悙鈺傛杸闂佹枼鏅涢崯顖炲磹閹邦兘鏀介柨娑樺閸樻挳鏌℃担绋库偓鍧楃嵁閸℃凹妲剧紓浣割儏閻楁挸顫忔繝姘<婵﹩鍏橀崑鎾绘倻閼恒儱娈戦梺鍓插亝濞叉牜绮婚悩缁樼厵闁硅鍔﹂崵娆撴煕濮橆剛绉洪柡灞糕偓鎰佸悑閹肩补鈧磭顔愮紓鍌欒兌婵參宕归崼鏇炶摕闁靛ň鏅滈崑鍡涙煕鐏炲墽鈽夋い蹇ユ嫹
开发学院数据库DB2 DB2 最佳实践: 性能调优和问题诊断最佳实践,第 2... 阅读

DB2 最佳实践: 性能调优和问题诊断最佳实践,第 2 部分:有条不紊地进行性能调优和故障诊断

 2009-11-12 00:00:00 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劎绮妵鍕箳鐎n亞浠鹃梺闈涙搐鐎氫即鐛崶顒夋晬婵絾瀵ч幑鍥蓟閻斿摜鐟归柛顭戝枛椤牆顪冮妶搴′簼缂侇喗鎸搁悾鐑藉础閻愬秵妫冮崺鈧い鎺戝瀹撲礁鈹戦悩鎻掝伀缁惧彞绮欓弻娑氫沪閹规劕顥濋梺閫炲苯澧伴柟铏崌閿濈偛鈹戠€n€晠鏌嶆潪鎷屽厡闁汇倕鎳愮槐鎾存媴閸撴彃鍓卞銈嗗灦閻熲晛鐣烽妷褉鍋撻敐搴℃灍闁绘挻娲橀妵鍕箛闂堟稐绨肩紓浣藉煐濮樸劎妲愰幘璇茬闁冲搫鍊婚ˇ鏉库攽椤旂》宸ユい顓炲槻閻g兘骞掗幋鏃€鐎婚梺瑙勬儗閸樺€熲叺婵犵數濮烽弫鍛婃叏椤撱垹纾婚柟鍓х帛閳锋垶銇勯幒鍡椾壕缂備礁顦遍弫濠氱嵁閸℃稒鍊烽柛婵嗗椤旀劕鈹戦悜鍥╃У闁告挻鐟︽穱濠囨嚃閳哄啰锛滈梺褰掑亰閸欏骸鈻撳⿰鍫熺厸閻忕偟纭堕崑鎾诲箛娴e憡鍊梺纭呭亹鐞涖儵鍩€椤掑啫鐨洪柡浣圭墪閳规垿鎮欓弶鎴犱桓闂佸湱枪閹芥粎鍒掗弮鍫熷仺缂佸顕抽敃鍌涚厱闁哄洢鍔岄悘鐘绘煕閹般劌浜惧┑锛勫亼閸婃牠宕濋敃鈧…鍧楀焵椤掍胶绠剧€光偓婵犱線鍋楀┑顔硷龚濞咃絿妲愰幒鎳崇喓鎷犻懠鑸垫毐闂傚倷鑳舵灙婵炲鍏樺顐ゆ嫚瀹割喖娈ㄦ繝鐢靛У绾板秹寮查幓鎺濈唵閻犺櫣灏ㄥ銉р偓瑙勬尭濡繂顫忛搹鍦<婵☆垰鎼~宥囩磽娴i鍔嶉柟绋垮暱閻g兘骞嬮敃鈧粻濠氭偣閸パ冪骇鐎规挸绉撮—鍐Χ閸℃ê闉嶇紓浣割儐閸ㄥ墎绮嬪澶嬪€锋い鎺嶇瀵灝鈹戦埥鍡楃仯闁告鍕洸濡わ絽鍟崐鍨叏濡厧浜鹃悗姘炬嫹闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劌銈搁弻鐔兼儌閸濄儳袦闂佸搫鐭夌紞渚€銆佸鈧幃娆撳箹椤撶噥妫ч梻鍌欑窔濞佳兾涘▎鎴炴殰闁圭儤顨愮紞鏍ㄧ節闂堟侗鍎愰柡鍛叀閺屾稑鈽夐崡鐐差潻濡炪們鍎查懝楣冨煘閹寸偛绠犻梺绋匡攻椤ㄥ棝骞堥妸鈺傚€婚柦妯侯槺閿涙稑鈹戦悙鏉戠亶闁瑰磭鍋ゅ畷鍫曨敆娴i晲缂撶紓鍌欑椤戝棛鈧瑳鍥ㄥ€垫い鎺戝閳锋垿鏌i悢鍛婄凡闁抽攱姊荤槐鎺楊敋閸涱厾浠搁悗瑙勬礃閸ㄥ潡鐛崶顒佸亱闁割偁鍨归獮宥囩磽閸屾艾鈧兘鎮為敃鍌涙櫔缂傚倷鐒﹂妵鍡涘炊閵娧冨笚闁荤喐绮嶇划鎾崇暦濠婂牊鏅濋柛灞炬皑閻撴垿姊洪崨濠傚Е闁绘挸鐗嗗玻鍧楀冀椤撶喓鍘卞┑鐘绘涧濡鎮甸弮鍌涘枑闁哄倽娉曢弳锕傛煙椤栫偛浜版俊鑼亾缁绘稓鈧數枪瀛濋梺闈涚墢鏋い顐㈢箻閹煎湱鎲撮崟顐ゅ酱闂備浇鍋愰埛鍫ュ礈濞戙埄鏁婂鑸靛姈閳锋垿鏌i幘铏崳缂佸娅g槐鎺楁偐瀹曞洤鈷屽Δ鐘靛仜閸燁垶濡堕敐澶婄闁宠桨璁查崑鎾寸節濮橆厾鍙冨┑鈽嗗灟鐠€锕€危婵傚憡鐓欓柤鎭掑劜缁€瀣叏婵犲啯銇濇俊顐㈠暙閳藉娼忛…鎴斿亾閸℃ḿ绡€缁剧増菤閸嬫捇鎼归銏$亷闁诲氦顫夊ú蹇涘垂娴犲绠栧ù鐘差儏瀹告繂鈹戦悙闈涗壕閻庢艾銈稿娲嚒閵堝懏鐎鹃梺鑽ゅ枂閸庢娊鍩€椤掍焦鐨戦柛蹇斆悾鐑筋敍濠靛牏鏉稿┑鐐村灦閻熝囧储闁秵鈷戠紓浣光棨椤忓棗顥氭い鎾跺枑濞呯娀鏌i姀鐘冲暈闁绘挸绻橀弻娑㈠焺閸愮偓鐣堕梺閫炲苯澧繝鈧潏鈺冪=闁规儳顕々鐑芥倵閿濆簼绨荤紒鎰⊕缁绘繈鎮介棃娴躲垽鎮楀鐓庡⒋闁绘侗鍣e畷濂稿Ψ閿旇瀚肩紓浣鸿檸閸樺ジ骞婃惔銊嬪顓兼径瀣幍濠电偠灏濠勮姳閼恒儰绻嗛柛娆忣槸婵秶鈧鍠楅幐鎶藉箖閵忋倕浼犻柛鏇樺妼瑜板繘姊婚崒姘偓鎼佸磹閹间礁纾瑰瀣椤愯姤鎱ㄥ鍡楀幊缂傚倹姘ㄩ幉绋款吋閸パ冪柧闂傚倷绶氬ḿ褔鎮ч崱妞曟椽鎮╃拠鑼紱闂佸湱鍋撻崜姘缚閳哄倶浜滈柟鎵虫櫅閻忊晝绱掓笟鍥ф珝婵﹨娅g槐鎺懳熼崷顓犵畳闂備線娼荤紞鍥╃礊娓氣偓閹即顢氶埀顒勭嵁閹烘绠犻柧蹇e亝椤ュ牓鏌涢埞鎯т壕婵$偑鍊栫敮鎺楀磹缂佹ḿ鈻旂€广儱顦伴悡銉︾節闂堟稒顥炴い銉уХ缁辨帡鍩﹂埀顒勫磻閹剧粯鈷掗柛灞捐壘閳ь剚鎮傞幃褎绻濋崟顓犵厯闂佺鎻粻鎴澬ч崣澶岀闁糕剝顨堢拹鈺呮煟閻旂ǹ顥愰柛顐邯閺屾盯顢曢悩鑼紕闂佸搫妫崑濠傤潖濞差亜浼犻柛鏇ㄥ幘閸斿湱绱撻崒姘毙¢柣鎺炵畵楠炲牓濡搁埡浣哄姦濡炪倖甯掔€氼參鎮¢崘顔界厵妞ゆ牗绮岄。鑲╃棯椤撶姴浜剧紒缁樼箞閸┾偓妞ゆ帊鐒︾紞鍥煏婵炑冩噹妤犲嫰姊绘担鍛婃儓婵炲眰鍔戝畷浼村箻鐠哄搫袣闂侀€炲苯澧柍瑙勫灴椤㈡瑩寮妶鍕繑闂備礁鎲¢敃銏㈢不閺嵮呮殾闁靛繈鍊栭崑銊╂煕濞戞☉鍫ュ箯閾忓湱纾介柛灞剧懅閸斿秹鏌ㄥ顑芥斀妞ゆ洖妫涢悾鐢告煛鐏炲墽娲存鐐达耿瀵爼骞嬪┑鍥ㄥ殘闂傚倷娴囬鏍窗濡ゅ嫭鎳屾繝鐢靛仧閸樠呮崲濡绻嗛柟闂寸鍥撮梺鎼炲劗閺呮繈寮虫导瀛樷拻闁稿本鐟чˇ锔界節閳ь剚娼忛埡浣哥亰濡炪倖鐗楃划宥夊汲濠婂牊鐓熼柟閭﹀墰閹界姵绻涢崨顖毿g紒缁樼洴楠炲鎮欑€靛憡顓荤紓浣哄亾瀹曟﹢宕戦幇顔筋潟闁规儳鐡ㄦ刊鎾偣閹伴潧鐏g紒杈ㄦ緲閳规垿鎮欓弶鎴犵シ濡炪倖娲﹂崣鍐春閳ь剚銇勯幒鎴濇灓婵炲吋鍔栫换娑㈠矗婢跺苯鈪归梺浼欑悼閸忔﹢銆佸Δ鍛妞ゅ繐鍟伴懗娲⒒閸屾艾鈧绮堟笟鈧獮澶愭晸閻樿尙顦梺鍝勬储閸ㄥ綊鎮块鈧弻锝呂熷▎鎯ф缂備讲鍋撻柛顐ゅ枔缁♀偓闂傚倸鐗婄粙鎾存櫠濞戞埃鍋撶憴鍕鐎殿喖澧庨幑銏犫槈閵忕姷顓洪梺缁樺姂閸斿海妲愭导瀛樷拺闁告繂瀚ˉ婊勪繆椤愶綆娈滈柛鈺冨仱楠炲鏁傞挊澶夋睏闂佸搫顦悧婊堝磻閸曨垰鍌ㄩ柨鐔哄У閳锋垿寮堕悙鏉戭棆闁告柨绉归弻锝呂旀担铏圭厒濠碘€冲级閸旀瑩鐛Ο灏栧亾濞戞顏堫敁閹惧绠鹃悗鐢登瑰瓭濡炪倖鍨甸幊姗€鐛Δ鍛仺闁告稑艌閹锋椽姊洪棃鈺佺槣闁告ü绮欏畷鐢稿焵椤掆偓閳规垿鎮欓懠顒佸嬀闂佺ǹ锕ョ换鍫ョ嵁閸愨斂鍋呴柛鎰ㄦ櫅閳ь剙顭烽弻锕€螣娓氼垱楔濡炪倖鏌ㄩ敃顏勵潖閾忚鍠嗛柛鏇ㄥ墮閸撳綊姊洪崨濞掕偐鍒掑▎蹇曟殾闁瑰墽绮崑銊╂煕濞戞☉鍫ュ箯濞差亝鈷戦柤濮愬€曢弸鎴炵節閵忊槄鑰挎鐐插暞缁楃喖鍩€椤掑嫬钃熼柨婵嗩槸缁犳娊鏌i幇顔芥毄闁哄棎鍊濆铏规嫚閳ヨ櫕鐏嶅銈冨妼閿曨亪鎮伴鈧浠嬪Ω閿曗偓椤庢捇姊虹粙璺ㄧ妞わ附澹嗛埀顒佷亢濡嫰鍩為幋锔藉€烽柤鎼佹涧濞懷呯磽娴g懓绲绘繛灏栤偓宕囨殾闁哄洢鍨瑰洿婵犮垼娉涢敃銈夊箚閻愮儤鈷戦梺顐ゅ仜閼活垱鏅剁€涙ɑ鍙忓┑鐘插暞閵囨繃顨ラ悙瀵稿⒌闁诡喗鐟ラ湁閻庯綆浜欐竟鏇㈡⒑閸濆嫮鈻夐柛妯圭矙瀹曟垹鈧綆鍠楅悡鐔镐繆椤栨氨浠㈤柛姘贡閳ь剝顫夐幐椋庢濮樿埖鍋傛い鎰剁畱閻愬﹪鏌曟繛褉鍋撳┑顔兼喘濮婃椽宕崟顒€娅ら梺璇″枛閸婂灝顕f繝姘╅柍鍝勫€告禍鐐烘⒑缁嬫寧婀扮紒瀣灴椤㈡棃鏁撻敓锟�濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻橀弻锝夊箣閿濆棭妫勯梺鍝勵儎缁舵岸寮诲☉妯锋婵鐗婇弫楣冩⒑閸涘﹦鎳冪紒缁橈耿瀵鏁愭径濠勵吅闂佹寧绻傚Λ顓炍涢崟顖涒拺闁告繂瀚烽崕搴g磼閼搁潧鍝虹€殿喛顕ч埥澶娢熼柨瀣垫綌婵犳鍠楅〃鍛存偋婵犲洤鏋佸Δ锝呭暞閳锋垿鏌涘☉姗堝姛闁瑰啿鍟扮槐鎺旂磼濡櫣浼屾繝纰夌磿閺佽鐣烽悢纰辨晬婵﹢纭搁崯瀣⒒娴e憡鍟炴い銊ョ墦瀹曟垿鎮㈤崫銉祫闂佸吋绁撮弲婵堝閽樺褰掓晲閸涱喗鍎撳銈呴閻倿寮诲☉銏犖╅柕澹啰鍘介柣搴㈩問閸犳盯顢氳閸┿儲寰勯幇顒夋綂闂佺粯岣块弫鎼佸级閹间焦鈷掗柛灞捐壘閳ь剚鎮傞幃褎绻濋崟顓犵厯闂佸湱鍎ら〃鍡涘磹閸洘鐓曟い鎰Т閸旀粓鏌涙繝鍕毈闁哄矉缍侀幃銏ゅ传閸曞灚姣夐梻浣告憸閸犳捇宕戦悢鐑橆潟闁圭儤姊圭€氭岸鏌熺紒妯虹瑲婵炲牏绮换婵堝枈婢跺瞼锛熼梺杞版祰椤曆囨偩閻戣姤鍋勭痪鎷岄哺閺咁剙鈹戦鏂よ€跨痪顓熸倐瀹曨垳鈧綆鍠楅埛鎴︽偣閸ャ劎鍙€闁告瑥瀚换娑欐媴閸愬弶鎼愮紒鐘靛劋缁绘繃绻濋崒婊冾杸闂佺ǹ顑傞弲娑㈠煘閹达箑纾兼慨姗嗗幖閺嗗牓姊洪幎鑺ユ暠闁搞劌缍婇幆鈧い蹇撶墱閺佸洭鏌i幇顓熺稇妞ゅ孩绋戦埞鎴︽倷閹绘帗鍊梺鍛婃⒐閻楁粓骞戦姀鐘闁靛繆鈧櫕顓绘俊鐐€栧濠氬磻閹剧粯鐓涢悗锝庝簻椤掋垽鏌曢崶褍顏い銏℃礋婵偓闁靛繈鍩勯崬铏圭磽閸屾瑦绁板鏉戞憸閺侇噣骞掗弴鐘辫埅闂傚倷绀侀崥瀣矈閹绢喖鐤炬繝濠傜墕閸氬湱鈧厜鍋撻柛鏇ㄥ厴閹风粯绻涢幘鏉戠劰闁稿鎹囬弻宥堫檨闁告挻鐩畷鎴濃槈閵忊€虫濡炪倖鐗楃粙鎺戔枍閻樼偨浜滈柡鍐ㄦ搐娴滃綊鏌¢崱妤侇棦闁哄被鍔岄埞鎴﹀幢濞嗗浚鏆梻浣告啞閺屻劑鎮樺璺何﹂柛鏇ㄥ灡閺呮粓鏌i敐鍛板鐎殿喓鍔戝铏规嫚閳ヨ櫕鐝紓浣虹帛缁诲啯绌辨繝鍥ㄥ殝闂傚牊绋撶粣鐐烘煟鎼搭垳绉甸柛鎾寸懅閺侇喗銈i崘鈹炬嫽婵炶揪绲挎灙妞ゃ儱绻橀弻娑氣偓锝庝簼閸d粙鏌熼獮鍨伈鐎规洘锕㈤、娆撴嚃閳哄骞㈠┑锛勫亼閸婃洜鎹㈤幇鏉跨疇闁归偊鍠氭稉宥夋煕閹炬せ鍋撻柛瀣崌閹兘寮跺▎鐐棏闂備礁鎽滄慨闈浢哄⿰鍫熷殟閺夊牄鍔庣弧鈧┑顔斤供閸撴盯鎮炬ィ鍐┾拺缂備焦蓱閻撱儵鏌涘顒夊剶闁糕晜鐩獮瀣晜閽樺鍋撻悽鍛婄厱闁挎棁顕ч獮鏍冀閿熺姵鈷戦梻鍫熺⊕椤ユ粓鏌涢悢鍛婂唉鐎殿喖顭锋俊鑸靛緞婵犲嫷妲伴梻浣藉亹閳峰牓宕滃▎鎾村亗闁绘柨鍚嬮崐鐢告偡濞嗗繐顏紒鈧崘顏嗙<閻犲洩灏欐晶锔锯偓娈垮櫘閸嬪﹤鐣峰鈧、娆撴嚃閳轰礁袝濠碉紕鍋戦崐鏍暜閹烘柡鍋撳鈧崶褏鍔﹀銈嗗笂閻掞箓藟閸懇鍋撶憴鍕闁挎洏鍨介妴浣糕枎閹惧啿绨ユ繝銏n嚃閸ㄦ澘煤閿曞倹鍋傞柡鍥ュ灪閻撳啴鏌嶆潪鎵槮闁哄鍊栫换娑㈠醇閻曞倽鈧潡鏌″畝瀣М闁诡喓鍨荤划娆撳垂椤曞懏缍掑┑鐘愁問閸犳牠鏁冮妷銉富濞寸姴顑呯粻鏍煃閳轰礁鏆為柛搴e枛閺屽秹鍩℃担鍛婃闂佷紮璁g紞浣割潖缂佹ɑ濯撮柧蹇曟嚀缁楋繝姊虹紒姗嗘畷婵炶尙鍠愭穱濠囧礈娴h櫣鐓撻柣鐘充航閸斿秴鈻撴ィ鍐┾拺缂備焦锚閻忥箑鐣濋敐鍫熺《鐎殿啫鍥х劦妞ゆ帒瀚埛鎴︽煙閼测晛浠滈柛鏂哄亾闂備礁鎲¢崝鎴﹀礉鎼淬劌围妞ゆ洍鍋撴慨濠傤煼瀹曟帒鈻庨幋鐘靛床婵犵數鍋橀崠鐘诲礋閸偒鍟嶉梻濠庡亜濞诧箑煤濮椻偓閿濈偤寮撮姀锛勫幐闂佹悶鍎崕閬嶆倶閳哄懏鐓曢悘鐐额嚙婵′粙鏌曢崶褍顏紒鐘崇洴楠炴ḿ鎹勬笟顖涙緫闂傚倷鐒︽繛濠囧绩闁秴鍨傞柛褎顨呴拑鐔兼煟閺傚灝鎮戦柛銈呭暣閺屽秵娼悧鍫▊缂備緡鍠栭悥鐓庮潖濞差亜宸濆┑鐘插暊閹风懓顪冮妶鍐ㄥ闁挎洦浜滈锝嗙節濮橆厽娅㈤梺缁樕戣ぐ鍐玻濞戞﹩娓婚柕鍫濇椤ュ牓鏌℃笟鍥ф灍闁逛究鍔戝畷鍫曞煛閸愵亷绱冲┑鐐舵彧缁叉寧鐏欓梺閫炲苯澧繝鈧柆宥呮瀬妞ゆ洍鍋撻柟顔哄灪娣囧﹪骞橀搹顐㈢獩闂侀€炲苯澧存繛浣冲洤绠烘繝濠傛噹椤ユ艾鈹戦崒婧撳湱鐥閺屾盯顢曢敐鍥f婵犲痉銈呬汗缂佽鲸甯掕灃濞达絼璀﹂弳锛勭磽娴h櫣甯涢柣鈺婂灦楠炲啴鍩勯崘鈺佸妳闂佹寧绻傚ù鍌炲疮鐎n喗鈷掑ù锝堟閵嗗﹪鏌¢崒娆戠獢鐎规洘绮岄埞鎴犫偓锝庝簽椤斿棝姊洪崨濠勨槈闁宦板姂閹繝濡烽埡鍌氣偓鐢告煥濠靛棙鍣藉ù鐘崇〒缁辨挸顓奸崱鈺傜杹濠殿喖锕ら…宄扮暦閹烘埈娼╂い鎴f娴滃墽鈧懓瀚崳纾嬨亹閹烘垹鍊為悷婊勭矊闇夐柡宥庡幗閻撳繐鈹戦悙闈涗壕婵炲懎妫濋弻娑欑節閸屾稑浠撮梺鍝勮閸旀垵顕i幘顔藉€锋繛鏉戭儏娴滈箖鏌涘┑鍕姢濞戞挸绉归弻锛勪沪鐠囨彃濮曢梺缁樻尰濞茬喖寮婚弴鐔风窞婵☆垳鍎ら悘鍫熺節閳封偓鐏炶姤鐝濋梺鍝勭焿缁辨洟鍩€椤掑﹦宀涢柡鍛箘缁綁寮崼鐔哄幐閻庡厜鍋撻柍褜鍓熷畷浼村冀瑜忛弳锔界節婵犲倹锛嶆俊鏌ョ畺閺岋綁濮€閳轰胶浠梺鐑╂櫓閸ㄨ泛顕f繝姘櫢闁绘ɑ褰冪粣娑橆渻閵堝棙顥嗘俊顐㈠閸┾偓妞ゆ帊绀佹慨宥夋煛瀹€瀣?濞寸媴濡囬幏鐘诲箵閹烘繃缍嗛梻鍌欐祰椤曟牠宕伴幘璇茬9婵犻潧妫涢弳锕傛煙閻戞ê鐏嶆俊鎻掔墛閹便劌螖閳ь剙螞閺冨倹顫曢柨鐕傛嫹闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劎绮妵鍕箳鐎n亞浠鹃梺闈涙搐鐎氫即鐛崶顒夋晬婵絾瀵ч幑鍥蓟閻斿摜鐟归柛顭戝枛椤牆顪冮妶搴′簼缂侇喗鎸搁悾鐑藉础閻愬秵妫冮崺鈧い鎺戝瀹撲礁鈹戦悩鎻掝伀缁惧彞绮欓弻娑氫沪閹规劕顥濋梺閫炲苯澧伴柟铏崌閿濈偛鈹戠€n€晠鏌嶆潪鎷屽厡闁汇倕鎳愮槐鎾存媴閸撴彃鍓卞銈嗗灦閻熲晛鐣烽妷褉鍋撻敐搴℃灍闁绘挻娲橀妵鍕箛闂堟稐绨肩紓浣藉煐濮樸劎妲愰幘璇茬闁冲搫鍊婚ˇ鏉库攽椤旂》宸ユい顓炲槻閻g兘骞掗幋鏃€鐎婚梺瑙勬儗閸樺€熲叺婵犵數濮烽弫鍛婃叏椤撱垹纾婚柟鍓х帛閳锋垶銇勯幒鍡椾壕缂備礁顦遍弫濠氱嵁閸℃稒鍊烽柛婵嗗椤旀劕鈹戦悜鍥╃У闁告挻鐟︽穱濠囨嚃閳哄啰锛滈梺褰掑亰閸欏骸鈻撳⿰鍫熺厸閻忕偟纭堕崑鎾诲箛娴e憡鍊梺纭呭亹鐞涖儵鍩€椤掑啫鐨洪柡浣圭墪閳规垿鎮欓弶鎴犱桓闂佸湱枪閹芥粎鍒掗弮鍫熷仺缂佸顕抽敃鍌涚厱闁哄洢鍔岄悘鐘绘煕閹般劌浜惧┑锛勫亼閸婃牠宕濋敃鈧…鍧楀焵椤掍胶绠剧€光偓婵犱線鍋楀┑顔硷龚濞咃絿妲愰幒鎳崇喓鎷犻懠鑸垫毐闂傚倷鑳舵灙婵炲鍏樺顐ゆ嫚瀹割喖娈ㄦ繝鐢靛У绾板秹寮查幓鎺濈唵閻犺櫣灏ㄥ銉р偓瑙勬尭濡繂顫忛搹鍦<婵☆垰鎼~宥囩磽娴i鍔嶉柟绋垮暱閻g兘骞嬮敃鈧粻濠氭偣閸パ冪骇鐎规挸绉撮—鍐Χ閸℃ê闉嶇紓浣割儐閸ㄥ墎绮嬪澶嬪€锋い鎺嶇瀵灝鈹戦埥鍡楃仯闁告鍕洸濡わ絽鍟崐鍨叏濡厧浜鹃悗姘炬嫹  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽弫鎰緞婵犲嫷鍚呴梻浣瑰缁诲倿骞夊☉銏犵缂備焦岣块崢閬嶆⒑闂堟稓澧曢柟鍐查叄椤㈡棃顢橀姀锛勫幐闁诲繒鍋犻褔鍩€椤掍胶绠撻柣锝囧厴椤㈡洟鏁冮埀顒€鏁梻浣瑰濡焦鎱ㄩ妶澶嬪剨閹肩补妾ч弨浠嬫煟閹邦剚鈻曢柛銈囧枎閳规垿顢氶埀顒€岣胯閿濈偛鈹戠€n€晝鎲告惔顭掔稏闁哄洢鍨洪悡娆撴煙鐟欏嫬濮﹂柛銈嗙懅閻ヮ亪骞嗚閹垹绱掔紒妯兼创鐎规洖宕灒闁惧繐婀遍幊鍡涙⒒娴e憡鍟為柨鏇ㄥ亞濡叉劙寮撮悩鎰佹綗闂佽鍎抽顓㈡偡瑜版帗鐓曢柕澶嬪灥鐎氼喛銇愰鐐粹拻濞达綀顫夐崑鐘绘煕閺傝法鐒搁柟顔哄劦瀹曟姊荤€靛摜鐣鹃梻浣告贡閾忓酣宕伴弽顐ょ焼闁告劏鏂傛禍婊堟煛閸愩劌鈧摜鏁崜浣虹<闁归偊鍘惧ú瀛樻叏婵犲啯銇濈€规洦鍋婂畷鐔煎垂椤愬诞鍥ㄢ拺闁硅偐鍋涙俊鑲╃磽瀹ュ拑宸ラ柣锝囧厴婵偓闁绘ê妫欏浠嬨€侀弮鍫濆窛妞ゆ挻绋戞禍楣冩煕椤垵浜芥繛鍫滅矙閺岋綁骞囬姘辨婵炲濮伴崹浠嬪蓟濞戙垹绫嶉柍褜鍓涢崰濠傤吋婢跺á锕傛煕閺囥劌鐏¢柡鍛矒閹綊宕堕鍕婵炲濮甸幃鍌炲箖濡ゅ啯鍠嗛柛鏇ㄥ墰閳规稓绱撴担铏瑰笡缂佽鐗撻幃浼搭敊閼恒儱鍔呴梺闈涒康缁犳垵鈻撻悢鍏尖拺闂傚牊鍐荤槐锟犳煕閹扳晛濡兼い鈺婂墴濮婂宕掑顑藉亾閹间降鍋戦柟缁㈠枛绾惧鏌涢弴銊モ偓瀣洪鍛珖闂侀€炲苯澧伴柛娆忔嚇濮婃椽宕崟顓夌娀鏌涢弬鍨劉闁哄懎鐖奸弫鎾绘偐閺傘儲瀚介梻浣呵归張顒勬偡閿斿墽鐭堥柣妤€鐗勬禍婊堟煛閸パ勵棞闁瑰啿顦靛畷鎴﹀箻鐠囨彃鐎銈嗗姂閸ㄨ櫣鎷犻悙鐑樺€甸悷娆忓缁€鍐磼椤旇姤宕屾鐐插暣婵偓闁挎稑瀚板顔界節閵忥絾纭炬い鎴濇川缁瑦绗熼埀顒€顫忕紒妯诲闁荤喐婢樻慨銏㈢磽娴h櫣甯涢柛鏃€娲熼弫鍐閳╁啰绉堕梺瀹犳〃缁垛€澄涘⿰鍫熲拺缂佸娉曠粻缁樹繆椤愩儲纭堕柟骞垮灲瀹曞崬螣闂€鎰泿闂備礁鎼粔鏌ュ礉鎼淬劊鈧倿寮婚妷锔惧幍濡炪倖鐗楀銊︽櫠濞戙垺鐓忛柛銉戝喚浼冨銈冨灪濞茬喐鎱ㄩ埀顒勬煏韫囧鐏╁┑顔块哺缁绘繂鈻撻崹顔界亪闂佹寧娲忛崕閬嶁€旈崘顔藉癄濠㈣泛鏈▓楣冩⒑缂佹ê鐏╅柣鈩冩瀵偊宕堕妸褏顔曢梺鐟邦嚟閸嬬喖骞婇崘顔界厽婵犻潧顑勯幉鐐叏婵犲嫮甯涢柟宄版嚇瀹曘劑妫冨☉姘毙ㄥ銈冨灪閻楃姴鐣烽妸鈺婃晣闁搞儯鍔庨埥澶愭煃鐟欏嫬鐏╅柍褜鍓ㄧ紞鍡樼閻愮儤鍋╁Δ锝呭暞閳锋垿姊洪銈呬粶闁兼椿鍨遍弲鍫曨敍閻愬鍘梺鎼炲劀閸愬彞绱撶紓鍌欒兌婵敻鎯勯鐐靛祦婵☆垰鐨烽崑鎾诲垂椤愶絽浠╅梺绋款儐閸旀牜鎹㈠┑鍫濇瀳婵☆垱妞垮ḿ鎴︽⒑閹肩偛濡藉鐟版閸┾偓妞ゆ帊鑳堕。鍙夌節閵忊槄鑰块柨婵堝仩缁犳盯骞樻担瑙勩仢妞ゃ垺妫冨畷鐔碱敂閸℃瑥鈧偤姊婚崒娆戭槮闁规祴鈧秮娲晝閸屾氨顦┑顔角瑰▔娑氱不椤栫偞鐓曟俊銈呭暙娴滃綊鏌¢埀顒佺鐎n偆鍘介梺褰掑亰閸樿偐寰婇懡銈囩<闁绘瑦鐟ラ崯浼村汲閸℃稒鐓ユ繝闈涙閸f椽鏌涚€c劌鍔滄い銊e劦閹瑩寮堕幋鐘辩礉濠电姵顔栭崰鎺楀磻閹剧粯鈷戠紓浣癸公娓氭盯鏌涚€n亝鍤囩€殿噮鍓熼崺鈧い鎺嗗亾闁宠鍨块幃鈺呭垂椤愶絾鐦庡┑鐘愁問閸犳牠顢氶銏犵劦妞ゆ帊绀侀崵顒勬煕閿濆繒鍒版い鏇秮瀹曞ジ寮撮悙娈垮晣濠电偠鎻徊浠嬪储濠婂牆绠繛宸簼閳锋垿鏌涘☉姗堝姛缂佺姵鎹囬幃妤€顫濋悡搴$濡炪倖鏌ㄧ换鎰板煘閹达箑骞㈤煫鍥ㄦ⒐閺夊憡淇婇悙顏勨偓鏍ь潖瑜版帒纾块柟鎯版閸屻劑鏌熺紒銏犳灍闁绘挻鐟﹂妵鍕籍閸ヨ泛娈悗瑙勬尭濡鍩為幋锔芥櫖闁告洦鍋勯獮瀣⒑缁洘娅旂紒缁樼箓閻g兘骞掗幊铏⒐閹峰懘宕滈煫顓犲簥濠电姷鏁告慨鐑藉极閹间礁纾婚柣妯款嚙缁犲灚銇勮箛鎾搭棞缂佽翰鍊曢湁闁绘ê妯婇崕蹇曠磼閻樹警娼愰柕鍥у楠炲洭鍩℃担鎻掍壕闁哄稁鍘煎Ч鍙夌節婵犲倻澧涢柛瀣剁秮瀵爼鎮欓弶鎴偓婊勩亜閹烘柨鏋涢柡宀嬬秮瀵剟骞愭惔顔斤紗闂備礁鎼惌澶岀礊娓氣偓楠炲啴濮€閻樺灚娈濋梺瑙勵問閸犳艾鈻旈崸妤佲拻濞达絽顫曢埀顑藉亾闂佺ǹ顑嗛幑鍥蓟閵堝棙鍙忛柟閭﹀厴閸嬫挸螖閸愵煈妫滄繝闈涘€搁幉锟犳偂閺囥垺鍊堕柣鎰版涧娴滈箖鏌i妸锕€鐏╅柍褜鍓氱粙鎺旀崲閸屾繄浜欐繝寰锋澘鈧洟鏁冮敐鍥С闁绘垼濮ら悡鏇熶繆閵堝倸浜鹃梺鍝ュ枎濞硷繝骞冩ィ鍐╁€婚柤鎭掑劚娴滄鏌熼崗鍏煎剹闁哥姵顨婂畷鎾绘偨閸涘ň鎷洪梺鍦瑰ù椋庣不閹剧粯鐓欓柛鎰皺鏍$紓浣规⒒閸犳牕顕i幘顔碱潊闁抽敮鍋撻柟閿嬫そ濮婃椽宕ㄦ繝鍕暤闁诲孩鍑归崜鐔奉嚕閸愭祴鏋庨柟鎯ь嚟閸樿棄鈹戞幊閸婃劙宕戦幘缈犵箚妞ゆ劧绲块妴鎺楁煕閹烘挸娴€规洖銈告俊鐑藉Ψ瑜滃Σ浼存⒒娴e摜锛嶉柟铏崌婵¢潧螣閼规澘小婵犵數濮电喊宥壦夋繝鍐︿簻闁规壋鏅涢悘顏堟煙閸忕厧濮堢紒缁樼〒閳ь剛鏁告灙闁告ɑ鎸抽幐濠傗攽鐎n偆鍙嗛梺鍝勬处椤ㄥ懏绂嶆ィ鍐┾拻闁搞儜灞拘х紓浣虹帛缁诲啰鎹㈠┑瀣<婵犲﹤鍟犻崣锟犳⒒娴i涓茬紒鍙夊劤椤啯绂掔€n亣鎽曢梺鎸庣☉鐎氼亜鈻介鍫熷仯闁搞儯鍔岀徊缁樸亜椤掆偓閻楁挸顫忛搹鍏夊亾閸︻厼顎屾繛鍏煎姍閺屾盯濡搁妷褌铏庨梺浼欑悼閸忔ê鐣烽敓鐘冲€烽柍鍝勫亞濞兼棃姊绘担鐑樺殌闁告埃鍋撶紓浣插亾濞达絽婀遍々鏌ユ煟閹伴潧鍘哥紒璇叉閺屾洟宕煎┑鍡忓亾閸涘﹦顩查柟顖嗗本瀵岄梺闈涚墕妤犵ǹ顕i妸鈺傜厱閹肩补妲呴悡鑲╁姬閹剧偨鈧帒顫濋敐鍛闂備礁鎼張顒勬儎椤栫偛绠栭柍杞拌兌閺嗭箓鏌涢妷鎴斿亾闁归澧楃换婵嬫偨闂堟刀娑㈡煕鐎n偅灏柕鍡樺笒椤繈鏁愰崨顒€顥氬┑鐘愁問閸犳牠鏁冮妸銉㈡瀺闁挎繂娲﹂~鏇㈡煙閻戞ê娈鹃柣鏃傚帶閸楁娊鏌i弮鍫濞寸厧鐭傚铏规嫚閳ヨ櫕鐏撻梺绋跨箲钃卞ǎ鍥э躬閹潡顢涢敐鍠般儵姊绘担鍛靛綊顢栭崱娑樼闁归棿绶ょ紞鏍ㄧ節闂堟侗鍎愰柛瀣€块獮鏍庨鈧悘顔济瑰⿰鍐ㄢ挃缂佽鲸鎹囧畷鎺戔枎閹达絿鐛ラ梻浣告憸婵潧顫濋妸鈺佺闁圭儤顨忛弫宥夋煟閹邦剙妫樼憸鏃堝蓟閵娿儮鏀介柛鈾€鏅滅瑧缂傚倷璁查崑鎾绘煕閹伴潧鏋熼柣鎾冲暣閺屾稑鈹戦崱妤婁患闂佸搫妫欓悷锕傘€冮妷鈺傚€烽柤纰卞墮椤も偓濠电儑绲藉ú銈夋晝椤忓牆绠栨繛鍡樻惄閺佸倿鏌涢弴妯哄濞存粓绠栭弻鈥愁吋鎼粹€崇缂備讲鍋撳鑸靛姈閻撴瑩寮堕崼婵嗏挃闁伙綀浜惀顏堝箚瑜忕粔娲煛瀹€瀣瘈鐎规洖鐖兼俊鐑藉Ψ瑜岄幃锝夋⒒娴e憡鍟為柛銊潐缁绘盯鍩€椤掍緡娈介柣鎰嚟婢ь亪鎳i幇顓滀簻闁瑰搫妫楁禍鐐節绾版ǚ鍋撻懠顒傜厯闂佸搫鐭夌紞渚€鐛Ο鍏煎磯闁绘垶岣挎禍顏堟⒒娴h櫣甯涢柟灏栨櫊瀹曟垶绻濋崒婊勬闂佽鍨堕崑濠傤瀶閵娾晜鈷戠紒瀣健椤庢绱掔紒姗堣€跨€殿喛顕ч埥澶愬閻樼數娼夐梻渚€鈧偛鑻晶浼存煕閹烘挸娴鐐瘁缚閹风娀鎳犻懜鍨暫闂傚倷绀侀幖顐⒚洪姀銈呭瀭鐟滅増甯楅崐宄扳攽閻樻彃顏柛鐘冲姉閳ь剙绠嶉崕閬嵥囨禒瀣瀬闁稿本绋忔禍婊堟煙閹规劖纭剧悮銉╂⒑缁嬫鍎愰柟鍛婃倐閸┿垽骞樼拠鎻掔€銈嗘⒒閺咁偅绂嶉懜鐢电瘈闁汇垽娼ф禒婊堟煕濮橆剦鍎旈柟顔惧厴婵℃悂鍩¢崒姘e亾閸洘鐓欓柣鎴烇供濞堟洟鏌嶉柨瀣伌闁哄本绋戦埥澶婎潨閸繂顫犵紓鍌欒兌婵敻骞戦崶顒€绠栨俊銈傚亾妞ゎ偅绻堥幃鈩冩償閳锯偓閹枫倖淇婇悙顏勨偓鎴﹀磹閺囥垹纾归柛锔诲幗瀹曞弶绻濋棃娑氬闁哄鐗嗛…璺ㄦ崉閾忓湱浼囬梺鎸庣〒閸犳牕顫忛搹鍦煓婵炲棙鍎抽崜閬嶆⒑閹肩偛濡奸柣蹇旂箞閹箖鎮滈挊澶岀杸闂佸搫顦冲▔鏇㈩敇濞差亝鈷戦柟绋垮绾剧敻鏌涚€n偅宕岄柡灞剧洴婵℃悂濡烽妷銏犱壕闁革富鍘藉畷鍙夌箾閹寸儑渚涢柛鐔锋噺閵囧嫰寮崶褍鎯為梺鍛婂灥缂嶅﹤顫忛搹鍦煓婵炲棙鍎抽崝鈧紓鍌欒兌缁垳鎹㈤崼婵愬殨閻犲洤妯婇崥瀣熆鐠虹尨姊楃紒鍗炵埣濮婃椽宕ㄦ繝鍐槱闂佸憡鎸婚悷銉╁煝瀹ュ鏅查柛銉㈡櫇閿涙繃绻涙潏鍓у埌闁圭⒈鍋呴悧搴ㄦ⒒娴h櫣甯涙い銊ョ墛缁绘盯鍩€椤掑倵鍋撳▓鍨灕妞ゆ泦鍥舵晣闁稿繒鍘х欢鐐测攽閻樻彃顏╂鐐村姇閳规垿鎮欓懜闈涙锭缂備浇寮撶划娆撶嵁婢舵劕鐏抽柡鍌樺劜閻忎線姊洪崫鍕潶闁稿孩鐓¢崺娑㈠箣閻樼數锛滈柣搴秵閸嬪嫰顢氬⿰鍫熺厵闁谎冩憸缁夘噣鏌$仦鍓ф创闁诡喒鏅涢悾鐑藉炊瑜夐幏浼存煟鎼淬埄鍟忛柛鐘崇墵閳ワ箑鐣¢柇锕€娈ㄩ梺鍦檸閸犳牠锝為崨瀛樼厽婵せ鍋撴繛浣冲洤鐒垫い鎺戝€告禒閬嶆煙椤旂厧妲绘顏冨嵆瀹曟﹢顢撻妯衡偓婵嬪蓟閵堝棎鍋婇柛褎顨呴幗鐢电磽娴h櫣甯涚紒璇插€块敐鐐测攽鐎e灚鏅i梺缁樕戣ぐ鍐不閵夆晜鈷掗柛灞剧懅椤︼箓鏌熺拠褏绡€鐎规洖缍婇、娑㈡倷閼碱剨绱梻浣告惈缁嬩線宕戦埀顒勬煕鐎n偅灏い顐g箞閹瑩顢楅埀顒勵敂閿燂拷
核心提示:概述就算是配置最仔细的系统也终究会发现它仍然需要一定的性能调优,并且这时我们已经搜集了的运行监控数据,DB2 最佳实践: 性能调优和问题诊断最佳实践,第 2 部分:有条不紊地进行性能调优和故障诊断,将来非常便于搜集,保持一种系统的方法来调优和进行故障诊断对我们非常重要,如果你的系统配置恰当而且监控良好,你就可以有效的解

概述

就算是配置最仔细的系统也终究会发现它仍然需要一定的性能调优,并且这时我们已经搜集了的运行监控数据,将来非常便于搜集。

保持一种系统的方法来调优和进行故障诊断对我们非常重要。当发生了一个问题,为了解决这个问题,很容易随意的进行调整。然而,当我们这么做了,事实上定位到问题的可能性非常低,甚至让问题更糟糕。性能调优的一些基本原则:

有备而来,去了解系统一切正常的情况下性能怎么样。搜集运行监视信息来跟踪一段时间内系统行为的变化。

了解整个场景,不要局限于你从 DB2 上看到的 – 也要搜集并分析来自于操作系统、存储、应用程序甚至来自用户的数据。了解系统本身将有助于你解释监控数据。

只调整能解释你看到的症状的参数,如果连发动机都无法启动就不要更换轮胎。不要试图通过降低 CPU 来解决磁盘的瓶颈。

一次只改一个参数,在更改其它参数之前先观察效果。

你可能遇到的问题类型

性能问题往往分为两大类:影响了整个系统的问题和只影响了部分系统的问题。比如某一特定应用或 SQL 语句,在研究的过程中-种类型的问题可能转化为另外一种类型的问题,或者相反。例如造成整个系统性能降低可能是一个单独的语句,或者是整个系统的问题只是在一个特定的区域被发现。

下面我们从整个系统的问题开始。

我们发现的所有导致性能降低的原因的方法就是从高层入手并逐渐提炼我们的诊断。这个“判断树”策略可以帮助我们尽可能早的排除那些不能解释我们所看到症状的因素,适用于整个系统或者更加局部的问题。我们将把瓶颈分成下面 4 种普通类型:

磁盘

CPU

内存

‘懒惰系统’

在开始一个对 DB2 调查之前,首先考虑一些准备问题常常是有帮助的,比如:

是否有性能降低,与什么相关?我们的‘基准’是什么?

一个系统的性能看起来在随时间流逝下降了?与一个不同的系统或不同的应用比较下降了?这个问题可以对性能降低的原因展开不同的可能性。数据量增加了?所有的硬件都运行正常吗?

性能下降是什么时候发生的?在另一个任务运行之前、之中、之后,性能下降或许周会期性的发生。甚至如果这个任务没有直接和数据库相关,它也可能由于消耗网络或者 CPU 资源影响数据库性能。

性能下降的前后关系有什么变化吗?通常是,添加了新硬件、或应用程序被更改了、大量数据被加载、或者更多的用户访问这个系统。

在据库专家和应用程序以及架构方面的专家一起工作的情况下,这些问题通常是一个综合分析方法一个很重要的部分。 DB2 服务器几乎总是硬件、其它中间件、和应用程序这样一个复杂环境的一部分,所以解决问题可能需要有多领域的技能。

磁盘瓶颈

System Bottleneck > Disk Bottleneck?

磁盘瓶颈的基本症状是:

在 vmstat 或 iostat 结果中出现较高的 I/O 等待时间。这显示系统会花费一小段时间等待磁盘 I/O 完成请求。等待时间达到 20% 或 25% 是很少见的。如果 CPU 时间非常低,那么高 I/O 等待时间是一个很好的预示了瓶颈所在。

从 iostat 或 perfmon 显示磁盘高达 80% 的繁忙程度。

从 vmstat 输出中看到较低的 CPU 利用率(25%-50%)

可能最终我们可能需要添加磁盘,但现在我们将检查我们是否能通过调优 DB2 系统消除这个瓶颈。

如果存在一个磁盘瓶颈,系统管理员可以帮忙映射一个繁忙设备镜像的文件系统路径。从这里你可以决定 DB2 如何使用这些受到影响的路径 :

瓶颈是表空间容器?这取决于在 sysibmadm.snapcontainer 中查询 TBSP_NAME,TBSP_ID 和 CONTAINER_NAME 的结果,查看造成瓶颈的路径是否在 CONTAINER_NAME 结果中。

瓶颈是事务日志路径?这取决于检查数据库配置参数的结果,查看造成瓶颈的路径是否是“日志文件路径”。

作为诊断日志路径?这取决于检查数据库管理配置参数的结果,查看造成瓶颈的路径是否是 DIAG_PATH 。

我们将分别考虑这几种情况。

System Bottleneck > Container Disk Bottleneck > Hot Data Container > Hot Table?

为了判断是什么导致容器成为瓶颈的,我们需要判断都有哪些表存储在这那个表空间而且最活跃。

要判断什么表在这个表空间,需要查询 syscat.tables,把 TBSPACEID 同上面的 snapcontainer.TBSP_ID 匹配

要找出哪些表最活跃,需要查询 sysibmadm.snaptab,选择在我们繁忙的容器上的表的 ROW_READ 和 ROW_WRITTEN 。查看那些水平活跃程度比其它要高很多的表。注意这需要打开实例级表监控开关 DFT_MON_TABLE

System Bottleneck > Container Disk Bottleneck > Hot Data Container > Hot Table > Dynamic SQL stmt?

进一步向下钻取,我们需要找出什么造成了这个表的高水平的活跃程度。是动态 SQL 语句造成的高度活跃?通过 sysibmadm.snapdyn_sql.TBSP_ID 查询动态 SQL 快照,来找出我们感兴趣的那些涉及这个表的语句:

select … from sysibmadm.snapdyn_sql where translate(cast(substr(stmt_text,1,32672) 
 as varchar(32672))) like ‘ %<tbname>% ’ 
 order by …

列返回能包含行的读和写,缓冲池活跃程度,执行时间,CPU 时间,等等。我们能在列上使用 ORDER BY 子句,比如 ROWS_READ,ROWS_WRITTEN 和 NUM_EXECUTIONS 来集中那些对表有最大影响的语句。注意我们假设这里的表名在 SQL 语句的头 32672 个字符中。这个假设虽然不完美,却在大多数情况下正确,也是需要使用 LIKE 。

select … from sysibmadm.snapdyn_sql where translate(cast(substr(stmt_text,1,32672) 
 as varchar(32672))) like ‘ %<tbname>% ’ order by …

System Bottleneck > Container Disk Bottleneck > Hot Data Container > Hot Table > Static SQL stmt?

是否是静态 SQL 语句导致的高活跃程度?在这里我们需要使用系统编目表和 db2pd 来找出哪写语句最活跃。查询 syscat.statements, 参考那些我们关注的表:

select PKGSCHEMA, PKGNAME, SECTNO, substr(TEXT,1,80) 
 from syscat.statements where translate(cast(substr(text,1,32672) 
 as varchar(32672))) like ‘ %<tbname>% ’

一旦我们有了涉及到我们感兴趣的那些表的静态 SQL 语句的包名和片段数字,我们就可以使用 db2pd – static 来找出它们中哪些是高度活跃的。 Db2pd – static 的输出都有一条从实例启动并执行过的每一个静态 SQL 语句的记录。 NumRef 计数器这条语句已经运行了多少次,并且 RefCount 计数器显示了当前有多少 DB2 代理程序正在运行这条语句。监视 db2pd – static 结果中的每一条调用记录。 NumRef 值的迅速攀升、 RefCount 的值经常超过 2 或 3,往往表明这是一个高度活跃的语句:

select PKGSCHEMA, PKGNAME, SECTNO, substr(TEXT,1,80) 
 from syscat.statements where translate(cast(substr(text,1,32672) 
 as varchar(32672))) like ‘ %<tbname>% ’

System Bottleneck > Container Disk Bottleneck > Hot Data Container > Hot Table > Hot SQL statement

如果我们能确定并得出一个或多个 SQL 语句导致了 I/O 瓶颈,下一步我们需要确这个语句是否可以被优化以降低 I/O 。这个语句是否发起了一个不期望的表扫描?这可以通过用 db2exfmt 检查查询计划以及比较这个问题语句的 ROWS_READ 和 ROW_SELECTED 来验证。由于在表扫描中使用了过时的统计信息或有索引问题,经常在临时查询的时候不可避免会发生表扫描,但是一个导致过多 I/O 并造成瓶颈的重复查询还是应该被讨论的。另一方面,如果受到的影响的表非常小,那么增加缓冲池大小对减少 I/O 和消除瓶颈或许已经足够了。详情参考这里对于查询优化和物理设计的最佳实践文章。

在我们讨论索引容器之前,先介绍两个数据容器磁盘瓶颈的情况:

我们希望一个产生大量磁盘读取的表扫描通过预取器完成。如果在预取过程中有任何问题(见下面的懒惰系统),读入缓冲池操作都将被代理程序自己完成,并且-每次只读取一页。在这种情况下,会产生导产生大量闲置的“懒惰系统”,或(如我们在此讨论的)磁盘瓶颈。因此如果有磁盘瓶颈是由于表扫描造成的,但是在 iostat 中却显示的读入大小比那个表空间的预取大小要小很多的话,可能是预取不足导致的问题。

通常,为了保证表空间后续读取时候有足够的可用缓冲池页面,页清理会对这个表空间产生一个稳定的写出流。然而如果在调整页清除有问题(见懒惰系统的瓶颈),代理程序将停下来自己做清理。这常常会产生页面清理的‘爆发’ - 周期性的高度活跃的写入(可能造成磁盘瓶颈),并与良好性能交替出现。

在后面懒惰系统的瓶颈章节,有更多关于如何诊断和解决这两个问题信息。

System Bottleneck > Container Disk Bottleneck > Hot Index Container > Hot Index?

一个发生在容器中的瓶颈,更多的可能是表活跃而不是索引活跃,但是一旦我们排除了表活跃的原因,我们就应该调查是否是索引活跃造成的问题。应为我们没有索引快照可以一用,就不得不通过间接的发现问题。

在表空间中索引读写是否很活跃?对表空间查询 sysibmadm.snaptbsp 的 TBSP_ID 对应上面 snapcontainer 的 TBSP_ID. select dbpartitionnum, tbsp_id, tbsp_name, 
 pool_index_p_reads, pool_index_writes from 
 sysibmadm.snaptbsp T 
 where T.tbsp_id = 
 <tablespace ID of hot container>

一个很大并不断增长的 POOL_INDEX_P_READS 或 POOL_INDEX_WRITES 值表明这个表空间有一个或多个‘忙碌的索引’。

这个表空间中有什么索引?

查询 syscat.tables 和上面的 snapcontainer.TBSP_NAME 匹配 INDEX_TBSPACE 。

select t.tabname, i.indname 
 from syscat.tables t, syscat.indexes i 
 where t.tabname = i.tabname and 
 coalesce(t.index_tbspace, t.tbspace) = 
 <name of table space with hot container>

这其中哪些索引是高度活跃的?如果在我们检查的表空间上有不止一个索引,我们就需要查看索引层面的活跃程度。反复搜集 db2pd – tcbstats index – db <dbname> 。在‘ TCB index Stats ’部分列出了所有活动的索引,以及每一个的统计信息。‘ Scans ’列显示了在每个索引上已经执行了多少次索引扫描。在繁忙的表空间使用索引列表来查看一个索引上的扫描总数,虽然增长非常迅速 KeyUpdates 或 InclUpdats(包括列值的更新)却很稳定。

System Bottleneck > Container Disk Bottleneck > Hot Index Container > Hot Index > Buffer pool too small?

索引扫描通常很划算,所以基于这一点研究是否能在缓冲池中放入更多的索引而非直接从硬盘读取是很合理的。增加缓冲池的大小,或为索引指定专门的缓冲池,可能足以降低 I/O 来消除平均。注意,在数据仓库环境中的索引通常非常大,分配足够的缓冲池来消除 I/O 不大可能。在那种情况下,通过增加额外的容器以提高磁盘 I/O 带宽来消除瓶颈或许更加有效。

System Bottleneck > Container Disk Bottleneck > Hot Index Container > Hot Index > Hot SQL Statement?

在我们找到了一个‘ hot table ’后,如果我们不能通过调优消除索引 I/O 瓶颈,或许我们需要更进一步的向下钻取,以找到导致索引 I/O 的 SQL 语句。不幸的是,我们并不能再一次像之前我们所做的那样只挖掘 SQL 语句文本,至少 I/O 瓶颈和具体的索引没有直接连系。

利用索引名称确定相应的表,然后用表名和上面描述的方法从活跃的表上找到可能使用这些索引的动态或静态的 SQL 语句。(这并不保证和表相关就一定会被使用。)那么我们需要使用 db2exfmt 来确定是否这些语句使用了索引。

System Bottleneck > Container Disk Bottleneck > Hot Temporary Table Space Container

从另一方面,如果这个繁忙的容器属于一个临时表空间,那么我们就需要考虑两个可能的原因。

是否这个临时表空间的 I/O 繁忙是由于排序溢出?这是一种情况,排序从设计的内存缓冲溢出必须使用一个临时表空间来代替。如果排序时间和溢出快照监控元素很高而且不断增长,或许这就是原因。 select dbpartitionnum, total_sorts, 
 total_sort_time, sort_overflows 
 from sysibmadm.snapdb

STMM 会尽全力避免这种情况;然而如果你没有使用 STMM 来控制 sheapthres_shr 和 sortheap,你可能需要手动来增加这些值。

是 I/O 由于庞大的中间结果导致的吗?如果是,这表明通过大量的临时数据的物理读写。我们应该在最初的时候就在表空间级的快照信息中检查这些,如果有临时数据 I/O 高的证据,那么我们就能从动态 SQL 语句的快照或者静态 SQL 事件监控数据中向下钻取。查找造成临时缓冲池中活跃的某个语句。 select dbpartitionnum, tbsp_name, 
 pool_temp_data_p_reads, pool_data_writes 
 from sysibmadm.snaptbsp 
 where tbsp_id = <tablespace ID of hot container>

System Bottleneck > Container Disk Bottleneck > Poor Configuration?

假设现在我们已经确定了一个发生以上类型瓶颈的容器 - 但是有时却会出现这种能情况,我们看不到任何明显的原因。没有繁忙的表,没有繁忙的索引,没有繁忙的 SQL 语句。可以调查几种可能的原因。

在这个表空间中有太多‘ fairly active ’的表或索引吗?虽然它们中没有一个能自己活跃到足以导致瓶颈的程度,它们聚集起来仍有可能相对于底层磁盘太过活跃了。一个解决方法是把这些表和索引分布到不同的表空间。另外一个可能性是向这个表空间添加更多的容器(提供的这些容器位于不同于现有容器所在的磁盘上,因此 I/O 能力得到了提升。)

太多的表空间共享了同样的磁盘吗?这一不小心就可能发生,表面上表空间占用了不同的逻辑卷,但是最终在最底层还是使用的同样的磁盘。像上面提到的,整体活跃 - 这个时候越过表,表空间或许要承担全部责任。合理的反反应是把一些表空间挪到别的磁盘上。

如果在这点上我们没有找到发生容器磁盘瓶颈具体的原因,至少我们已经排除了大多数‘可调整问题’,而且应该考虑增加而外的磁盘吞吐能力来提高这个‘问题’表空的性能。

System Bottleneck > Log Disk Bottleneck?

虽然容器磁盘瓶颈很普遍,日志磁盘瓶颈却能对系统更大的影响。这是因为日志速度降低能影响系统中所有的 INSERT/UPDATE/DELETE 语句,不仅是某些表或索引。像其它类型的磁盘瓶颈最主要的症状就是 iostat/perfmon(90% 或者更高)。日志瓶颈也会造成事件监控器中的更长的提交时间,在应用程序快照中更多的代理程序处于‘ commit active ’状态。

如在这个章节提到过的对于日志配置,强烈建议在数据运行中,日志不和任何‘ active ’对像共享磁盘,比如容器,等等 。这是在发生日志瓶颈的时候需要首先反复确认的事情之一。

如果日志有它自己的磁盘,那么我们需要了解瓶颈的性质。

如果 iostat 显示日志设备每秒执行 80-100 个操作,并且平均的 I/O 大小是 4k 字节,这表明日志饱和更多的发生在 I/O 操作上而非完全是数据量导致的。
这种情况有两种可能。

首先,系统中的一些应用程序可能提交得过于频繁 - 或比需要的要频繁。高提交率的应用程序可以通过应用程序快照来确定(比较 select/insert/update/delete 语句提交率,并查看每分钟提交的数目)。在极端情况下(例如,自动提交开启,并且 SQL 语句都很短),是可能造成日志设备饱和的。在应用程序中减少提交频率对于减少日志瓶颈有直接的好处。

造成频繁日志写的另外一种可能是日志缓冲区太小。当日志缓冲满了,DB2 必须把它写入磁盘,而不管其是否提交。对于日志缓冲被迅速填满的情况(如 sysibmadm.snapdb 的监视元素 num_log_buffer_full 所报告的)很可能导致这个问题。



System Bottleneck > Log Disk Bottleneck > Large Number of Log Writes

过多的数据写入同样可以造成日志瓶颈。如果随着设备利用率越来越高,iostat 也会显示写入日志设备的数据超过 4k 字节很多,这表明比起高事务率,数据量对产生这个问题负有更多的责任。

或许根据你的具体环境可以降低记日志记录数据的量 :

当 DB2 更新表中的一行的时候,它会记录从第一个被更改的列到最后个被更改的列之间的所有列 - 包括那些没有被更改的列。在定义表的时候,将那些经常修改的列放在一起能减少更新时日志记录的量。

大对像(CLOB,BLOB,DBCLOB)列默认是要记日志的,但是如过这些数据可以从数据库之外恢复,从减少 INSERT/UPDATE/DELETE 操作的时候日志记录的数据量,它们可以适当的标记为NOT LOGDED 。

如果大量日志数据跟大批 SQL 操作(比如,有子查询的 INSERT,有时用于数据维护和数据装载过程)有关,目标表或许能设置为 NOT LOGGED INITIALLY(NLI)。这会在当前工作单元不记日志。需要顾及到对 NLI 表的可恢复过程;然而,如果适合你的系统,NLI 可以非常明显的降低日志数据量和相应的提高性能。当然,如果这批操作是直接 INSERT,可以用 load 使用工具替代,它也能同样地避免记录日志。

System Bottleneck > Log Disk Bottleneck > High Volume of Data Logged

无论哪种情况 - 不管是日志的高写入频率还是数据写入量高造成的日志瓶颈 - 要消除问题的原因往往是不可能或者不切实际的。一旦我们确认日志配置遵循了上面描述的最佳实践,或许就需要通过提高日志系统的能力来解决问题。要么通过添加额外的磁盘到日志 RAID 队列中,要么提供一个专门的或者升级了的磁盘缓冲控制器。

System Bottleneck > Diagnostic PathBottleneck?

DB2 诊断日志路径― db2diag.log 存放的地方 - 繁重的磁盘写入能造成整个系统的性能下降,这很难分离,因为普通的 DB2 监控元素并不跟踪它。在多分区环境中所有分区都写入同样的诊断日志路径,它一般是通过网络共享 NFS 文件系统。类似于分区间同步,从许多分区对 db2diag.log 的并发写入可能会导致很高的网络通讯和 I/O 负载,并因此降低系统性能。正如在前面配置章节提到的,解决这个问题最简单的办法就是为每个分区指定一个单独的诊断日志路径(并指定一个专门的诊断日志文件)。

设置 DB2 的 diaglevel 数据管理配置参数为 4 会增加诊断信息的数据量,这会导致明显的性能影响 - 尤其在一个大型的多分区(DPF)环境。性能急剧下降甚至可能造成 DIAGPATH 文件系统满并最终使系统停止。为了避免这种情况,你应该确认诊断日志文件系统有足够的可用空间,通过归档诊断信息或者分配一个专门的文件系统给 DB2 存放诊断信息。


图 1. 磁盘瓶颈 - 总图
DB2 最佳实践: 性能调优和问题诊断最佳实践,第 2 部分:有条不紊地进行性能调优和故障诊断

图片看不清楚?请点击这里查看原图(大图)。

CPU 瓶颈

System Bottleneck > CPU Bottleneck?

CPU 瓶颈表现在两个方面:

所有 CPU 都饱和 - 意味着这个系统上的所有处理器都繁忙。根据 vmstat 和 perfmon 的报告,一般的标准是计算用户 CPU 时间和系统 CPU 时间。 CPU 利用率超过 95% 就被认为是饱和的

单个 CPU 饱和 - 意味着系统上的在一个处理器上的负载达到了饱和,但是其它处理器却部分或完全空闲。这通常发生在系统中只有一个很忙的应用程序在运行。虽然还有可用的 CPU 能力,系统却无法消费,因此,应用程序或语句的速度取决于这一个处理器内核的繁忙程度。

同样我们也应该考虑到用户模式和系统模式上不同的 CPU 消耗。一种是处理器正在运行操作系统内核以外的软件比如 DB2 应用程序或者中间件,导致用户 CPU 时间增多。一种是在运行操作系统内核的时候系统内存增多。这两个在数量上是分开显示的,并且根据它们之间的分布情况,可以帮助我们找到 CPU 瓶颈的原因。用户和系统 CPU 时间比率在 3:1 到 4:1 之间是正常的。如果在有瓶颈的系统中,用户和系统时间比率高于这个区间,我们应该收件调查用户 CPU 时间增加的原因。

System Bottleneck > CPU Bottleneck > User CPU Bottleneck

在 DB2 服务器上造成用户 CPU 瓶颈的许多原因可以通过抓取快照和语句事件监控器来诊断。我们可以使用应用程序快照或查询 sysibmadm.snapappl 管理视图来向下钻取,以找出是什么用户消耗了大多数 CPU 时间:

select appl.dbpartitionnum, appl_name, 
 agent_usr_cpu_time_s + agent_usr_cpu_time_ms / 1000000.0 as user_cpu 
 from sysibmadm.snapappl appl, 
 sysibmadm.snapappl_info appl_info 
 where appl.agent_id = appl_info.agent_id and 
 appl.dbpartitionnum = appl_info.dbpartitionnum order by user_cpu desc

同样(并且更又有用),通过动态语句快照,或查询 sysibmadm.snapdyn_sql 管理视图,我们也能确定什么 SQL 语句正在使用绝大多数 CPU 时间:

select substr(stmt_text,1,200), 
 total_usr_cpu_time + 
 total_usr_cpu_time_ms / 1000000.0 as user_cpu 
 from sysibmadm.snapdyn_sql 
 order by user_cpu desc

通常情况下,我们查找一个或多个语句,它们消耗‘比它们平均份额更多’的 CPU 。这转化并增加 TOTAL_USR_CPU_TIME 和 TOTAL_USR_CPU_TIME_MS 的值

同时,我们应该考虑静态 SQL 语句。如上面所提到的,快照监控器并没有包含这类信息。所以我们需要使用语句事件监控器,或者 WLM 活动事件监控器,来收集它们的 CPU 使用信息。有一些推荐的步骤可以用来把语句事件监控器的开销减少到最小:

事件监控器的默认 BUFFERSIZE 是 4 页,这需要增加到 512 页以获得更好的性能。

在一个单独的表空间创建语句事件监控表。这避免了事件监控数据和其它表的 I/O 冲突。这样也让我们有机会选择更大的表空间,这样能最小化 SQL 语句被截断。

在 CREATE EVENT MONITOR 命令的时候使用 TRUNC 选项。和存入另外的大对像列相比,这会强制把 SQL 语句文本保存在同一行,如花费的时间,CPU 时间等等…注意这可能会导致在事件监控结果中 SQL 语句被截断。根据语句事件监控表的页大小(比如,一个 4K 页能存 3500 字节),一部分 SQL 语句可以以这种方式存储。

使用 WHERE 子句把监视范围集中在一部分连接或应用程序上。虽然监视连接会有额外的开销,但是使用 WHERE 子句将减少事件监控导致的总的系统开销。

把所有这些放在一起,并且从 LIST APPLICATIONS 得到我们关注的连接对应的应用程序 ID,我们将得到跟下面一样的结果:

create event monitor stmt_evt for statements 
 where appl_id = '*LOCAL.DB2.075D83033106' 
 write to table 
 connheader(table stmt_evt_ch, in tbs_evmon), 
 stmt(table stmt_evt_stmt, in tbs_evmon, trunc), 
 control(table stmt_evt_ctrl, in tbs_evmon) 
 buffersize 512

对 WLM 活动监视器也有类似的原则。一个大的 BUFFERSIZE,单独的表空间和 TRUNC 选项都是减少开销的好思路。 WLM 活动监视器不支持 WHERE 子句,不过在活动监视器被定义的时候,在工作量或者服务类型里已经隐含了一个范围。和 WHERE 子句相同,这也能非常有效的降低性能开销和收集的数据量。注意如果在活动监视器使用了 WITHOUT DETAILS 字句 , 将提供我们所需要的 CPU 消耗的基本信息。提高到 WITH DETAILS 或者 WITH DETAILS AND VALUES 会提供其它的有用信息,但是如果监视开销堆你的环境是一个问题,那最好还是从 WITHOUT DETAILS 开始,然后在需要的情况下启用 DETAILS 或 VALUES 。

System Bottleneck > CPU Bottleneck > User CPU Bottleneck > High CPU SQL

我们并不总是能够减少一个 SQL 语句请求的 CPU 量,但是在某些情况下我们可以影响它。

一个频繁运行的对缓冲池中的表扫描能消耗令人吃惊的 CPU 时间。这可以发生在一个很小的表上,它没有合适的索引而它却会在一个连接中被查询到。我们能看到的症状包括

(i)相关地语句运行很短地时间

(ii)用户 CPU 消耗大致等于执行时间

(iii)在查询计划中又一个关系查询

(iv)db2pd – tcbstats 中查询数目不在增加

(v)对于这个语句只发生非常少地物理读。


虽然这类语句不属于我们通常考虑的瓶颈,频繁执行和 CPU 的高消耗却能让它成为问题。通常我们的响应是创建一个索引给优化器在表查询的时候多一个选项。一个正确的索引定义可以在查询计划中明显的被看到,如果没有,在这里设计顾问程序可以提供协助。

如果应用程序执行一个 SQL 语句却只会用到一小部分产生的数据,使用 OPTIMIZE FOR n ROWS(OFnR)和 FETCH FIRST n ROWS ONLY(FFnRO)子句能帮助减少所有类型的资源消耗,也包括 CPU 。详细说来,比起优化返回结果集中所有的行给应用程序,OFnR 和 FFnRO 能帮助优化 SQL 查询计划来返回结果集的初始行更加有效。如果只用了 OFnR,n 可以在运行时被超过;然而 FFnRO 将阻止超过 n 的行数被返回,即使应用程序也尝试这么做。

正如之前配置章节我们提到的,使用了文化正确性校验序列的 Unicode 代码页会产生大量的开销,尤其在 CPU 消耗上。因为开销的总量和 SQL 语句产生的字符串数据比较量直接相关(在谓词中,或者在 ORDER BY 子句引起的排序,等等),如果我们能减少一个语句产生的数据比较量,我们将减少 CPU 消耗。这常常能通过鼓励在预先评估和结果集排序时都使用索引来实现。设计顾问程序会设计正确的索引来将表扫描和排序减到最少。

锁的问题通常只存在于冲突和等待时间这两个方面。然而就算有很少或者根本没有冲突,获取和释放锁的过程也会消耗大量的 CPU 时间。考虑一个要检查表里很多行的应用程序或语句,由于只有它自己在运行就只产生了少量的锁冲突,因为对它涉及的表的访问是排他访问,或是因为所有并发的应用程序都使用的是只读模式。在这样的情况下为了降低 CPU,可以使用表级别的锁定来达到被要求的隔离级别

如果没有 SQL 语句看起来消耗了大量的 CPU,也有很多潜在问题会导致整体 CPU 消耗增加。

System Bottleneck > CPU Bottleneck > User CPU Bottleneck > Dynamic SQL without Parameter Markers?

比起使和用参数标记,许多应用程序通过连接语句片段和字符串值来构建它们的 SQL 语句。(注意,使用分发统计信息的复杂的 SQL 语句、以及嵌入的文字信息可以帮助 SQL 优化器选择一个更好的查询计划。作为替代,我们专注于嵌入文字信息没有任何好处的轻量级语句) String procNameVariable = "foo"; 
 String query = 
 "SELECT language FROM " 
 + "syscat.procedures " 
 + "WHERE procname =" 
 + " ‘ " 
 + procNameVariable// inject literal value 
 + " ‘ ";



System Bottleneck > CPU Bottleneck > User CPU Bottleneck > Utilities Running?


为了尽快完成工作,DB2 实用工具被设计成扩展良好并充分利用系统资源。那就是说在一个实用工具正在运行时,可能 CPU 使用会有显著的增加。 Load 和 runstats 是一个实用程序的很好的例子,它们经常导致高 CPU 使用,但是在正常情况下,其它的实用程序也能这样。正在运行的实用程序可以通过 LIST UTILITYES SHOW DETAIL 命令看到。

如果实用程序正在执行,我们可以向下钻取来判断它的 CPU 使用情况。在 Unix 和 Linux,在 DB2 9.5 引入线程引擎之前只需通过一个简单的ps命令,就可以看见实用程序许多的工作进程(伴随这 CPU 的使用,等)到 DB2 9.5 db2pd – edus 命令显示了 DB2 引擎中的所有线程,包括用户和系统的 CPU 使用。这对决定是否某个线程是 CPU 瓶颈的时候非常有用。

设置 UTL_IMPACT_PRIORITY 可以有助于限制 BACKUP 和 RUNSTATS 对系统的影响。另外 RUNSTATS 的开销和运行时间可以通过两个方法降低(1)收集统计信息时仅对那些会作为谓词的列(因此它需要统计信息)如果知道的话。(2)使用样本统计信息,也是很好的建议,在后面的“写和调优查询以优化性能”提到。

默认情况下,在 LOAD 命令将对每个 CPU 都创建一个格式化程序线程(db2lfrm),但是通过使用 CPU PARALLELISM n 选项,我们可以把格式化程序减少到 n,来为剩下的系统留出更多的 CPU 能力。注意,通常情况下,通过 UTL_IMPACT_PRIORITY 或 CPU PARALLELISM 等来限制一个实用程序会成比例的延长使用程序的运行时间。



System Bottleneck > CPU Bottleneck > User CPU Bottleneck > Temporary Object Cleanup Overhead

当一个系统临时表不再需要然后可以删除了的时候,DB2 必须从缓冲池中移除它不在需要的页面。如果这经常发生,而且如果临时表和普通用户数据共享缓冲池,会导致耗费额外的 CPU 时钟周期来解决冲突和处理页面。比起复杂查询系统,这个问题在事务处理系统更常见。如果表快照显示有很多临时表被创建和销毁,最佳实践是把临时表放到它们自己的的缓冲池里面。这会消除多于的冲突和处理开销,并对降低 CPU 实用有好处。

System Bottleneck > CPU Bottleneck > System CPU Bottleneck?

在大多数 CPU 受限的环境中用户 CPU 往往是决定因素,不过系统 CPU 有时也能成为决定因素。虽然我们能诊断出很多原因,但是能最终解决的只有极少数。

系统 CPU 时间高的一个原因是与之相关的 DB2 在操作系统(OS)中上下文切换率过高。一个上下文切换是 OS 用来切换它需要处理的不同任务。上下文开关被系统中不同的规则触发。然而当上下文切换得太频繁,它们自己最终可能导致消耗大量 CPU 时间。在 Unix,上下文切换在 vmstat 中在‘ CS ’列有记录。每秒超过 75,000 到 100,000 次的上下文切速度被认为是非常高了。

System Bottleneck > CPU Bottleneck > High System CPU > High Context Switches

在 DB2 系统中导致上下文切换率高的原因是大量的数据库连接。每个连接都有一个或多个的数据库代理进程为它工作,所以如果连很活跃-尤其对于很短的事务-会导致高上下文切换率何高 CPU 消耗的结果。避免这种情况的一种方法是开启 DB2 连接集中器。它允许多个连接共享一个代理程序,因此降低了代理数目(节约了内存占用),并降低了上下文切换率。

设备中断也会导致 CPU 时间高。一个设备(如网卡)发生一个中断就需要操作系统的‘注意’。一次中断的成本并不高,然而如果中断的频率太高,系统的总的负载会非常高。幸运的是,现在的网卡何磁盘转适配器已经从 OS 中高度独立出来了,比起前几年的产品,现在只产生了非常少的中断。来自磁盘的显著中断开销很少,不过在网络密集的客户端 / 服务器系统(像许多 SAP R/3)网络中断造成的开销可能会非常高。有些步骤可以用来降低网络在服务器上造成的开销,不过这类调试超过了本文讨论的范围。在这样的场合你最好还是让你的网络管理员来定位并解决问题。

如果应用逻辑(尤其是较长的事务)能被写入一个 SQL 存储过程,这会有助于减少上下文切换和网络通信量。这么做不仅是把应用程序逻辑存入服务器,在上下文切换问题范畴,它也直接把逻辑推入 DB2 代理程序。这就消除了代理程序和客户应用程序之间的 SQL 调用和结果的进出流 - 从而减少了上下文切换。

System Bottleneck > CPU Bottleneck > High System CPU > High Device Interrupts

在一个 DB2 系统中,我们通常尽可能的让系统有很少的空闲内存并努力开发系统内存。不幸的是,如果我们过多的分配了内存 - 就像错误配置 DB2 或者其它软件一样,使用了超过系统物理内存的总量 - 页清除操作将造成系统 CPU 开销(磁盘开销也有可能)。这种情况在 UNIX 上通过低空闲内存和 vmstat 动态输出众较高的页面换入 / 换出,来确定。修正的办法就是把内存分配降到触发页清除操作起点之下。

文件缓存消耗了内存是稍微有点棘手的情况。为了避免 I/O,OS 通常使用空闲内存来缓存磁盘数据。虽然文件缓存使用的内存在需要的时候 DB2 可以使用,我们总是希望避免 DB2 和文件系统在内存上发生‘拔河’的情况。由于文件系统缓存处理它自己是发生在用户模式(它不消耗系统 CPU)而虚拟内存管理又能增加系统 CPU 使用,在这篇文章前面的‘ DB2 配置’章节中建议了要避免系统缓存影响 DB2 。在 AIX 上,使用 vmo 参数 LRU_FILE_REPAGE=0(同样在上面讨论过)能有助于确保 DB2 外的系统缓存开销在可控的范围。

System Bottleneck > CPU Bottleneck > High System CPU > Over-allocation of Memory

拥有庞大内存总量的系统 - 100G 或者更多 - 如果系统没有配置使用大内存页就会产生额外的 CPU 开销。操作系统是以页为最小粒度来管理内存的(注意这和 DB2 的页有所不同)。一个典型的页大小是 4KB -这意味着操作系统必须管理 100G 内存的 250,000,000 个页表项。大多数操作系统都支持更大的页大小,这有助于减少虚拟内存管理的开销。以 AIX 为例,支持的最大页大小达到了 16G 。这虽然在实际中几乎用不到,不过有其它的页大小可供手动选择。在大多数拥有庞大内存的系统的最佳实践是确保在启用了 64-KB 页,在 AIX 中 DB2 可以使用它们。这是在良好性能和最小化使用大页面带来的副作用之间的折衷。在 Linux 中,DB2 必须通过DB2_LARGE_PAGE_MEM来手动启用对大数据页的支持。

在 AIX 上,vmstat -P ALL 显示了系统提供并使用了的页大小是多少。如果系统使用了 64KB 的页面并且数据库正在运行,通过 vmstat – P ALL 你可以看到非常多的 64KB 页被分配。如果系统有很大的物理内存却没有使用 64KB 页,这会导致高于正常水平的系统内存消耗。

System Bottleneck > CPU Bottleneck > High System CPU > Small Memory Pages

系统 CPU 瓶颈 – 总图


图 2. 系统 CPU 瓶颈 – 总图
DB2 最佳实践: 性能调优和问题诊断最佳实践,第 2 部分:有条不紊地进行性能调优和故障诊断

图片看不清楚?请点击这里查看原图(大图)。

内存瓶颈

System Bottleneck > MemoryBottleneck?

系统有充足的内存并得到正确的配置是良好性能的关键。否则,如果没有恰当的内存访问,数据在填满缓冲后就将转向 I/O - 在这个过程中常常会造成磁盘瓶颈。同样,虽然总量小一些却很重要的内存也被用来存储元数据以及运算结果,比如 SQL 查询计划和锁。如果它们缺少内存,系统不得不取消或销毁那些重要信息,并重新运算要不就以额外的处理来补偿-增加了 CPU 的开销。因此,一个内存瓶颈经常能把自己伪装成磁盘或 CPU 问题。

下表把我们在前面讨论过的可能由于底层内存的原因造成的磁盘和 CPU 瓶颈再回顾一下。

瓶颈类型主要症状内存问题潜在的造成 / 影响瓶颈
磁盘数据或索引表空间瓶颈  缓冲池太小

整个系统的内存太小

磁盘临时表空间瓶颈  Sortheap / sheapthres_shr 太小

系统总内存太小

磁盘日志磁盘瓶颈  日志缓冲太小
CPU重复保缓存插入造成的 CPU 瓶颈  包高速缓存太小

系统总内存太小

CPU过多的系统 CPU 时间花费再 VMM 上  系统总内存过度分配

较小系统内存页大小管理很大的系统内存

这是最常见的有 CPU 或磁盘瓶颈症状的内存瓶颈,并且是在分析这种问题时内存问题的主要可能性。然而在内存短缺的时候也是经常发生的(像 vmstat 报告的)-伴随着低性能让我们把这放到第一的位置-是明显的症状。如果进一步调查数据(vmstat)显示持续活跃的页面调度(有可能伴随系统 CPU 使用的升高),这表示系统内存压力过大。

DB2 的内存分配分成两大类:

数据库和实例级分配,分配了像共享数据库内存,从缓冲池、排序堆、锁列表到包缓存等等。对于定位内存过度分配的原因,共享内存非常容易处理,因为分配是和数据库连接数没有关系。这些分配都受到 DATABASE_MEMORY 配置参数的限制。

连接层面或应用程序分配,像应用程序堆和语句堆。连接层总的内存消耗明显依赖与连接数,这可能会使得在系统初始化配置时候更难预估。在 DB2 9.5 每个应用程序内存都在 INSTANCE_MEMORY 保护伞下,所以由于突然连接导致的逃逸分配变得不大可能。

无论是直接指定堆大小还是启用 STMM,判断 DB2 内存实际用量的最好办法就是查看 database,database manager 和应用程序快照的内存使用部分(或 sysibmadm.snapdb_memory_pool snapdbm_memory_pool, 和 snapagent_memory_pool 管理视图),它们提供了数据库,实例和应用层面各自的配置堆大小和当前堆大小。这些让你检查配置的和当前堆和应用程序的分配,以及检查当前总的分配。

DB2 9.5 内存使用的最高限制是通过 INSTANCE_MEMORY 数据库管理配置参数,和 DATABASE_MEMORY 数据库配置参数。在大多数系统中,它们默认为 AUTOMATIC, 这意味著实例和数据库的内存的使用可以上下浮动。(它们的当前值通过 get database manager configuration 和 get database configuration 命令的 SHOW DETIAL 选项)因此,DB2 的内存管理系统是设计来避免我们在这里讨论的内存瓶颈问题。为什么仍然发生内存瓶颈?

如果 INSTANCE_MEMORY 被设置为一个确定的数值,并且 STMM 启动了,那么 STMM 将调整 DB2 内存消耗只达到 INSTANCE_MEMORY 的值。在这种情况下,STMM 不会对系统释放内存的压力做出反应(因为 INSTANCE_MEMORY 没有设置成 AUTOMATIC)因此,可能 DB2 和其它像应用程序服务器这样的内存使用大户等一起,会把系统范围的总的内存用量推到过高位置。 Unix 的 ps 命令或者 Windows 的任务管理器将显示进程的内存使用,是一个无价的工具用来跟踪数据库外的“memory hogs ”。

如前面提到的,当文件系统缓存对于 DB2 这样的消费者是技术上存在的,DB2 也能成为大量文件缓存的原因(尤其对于在内存能释放给其它内存用户之前,修改的数据必须存到磁盘)如果产生了额外的内存需求,这可能导致发生页清除。

如果在这个服务器上存在很强的非 DB2 的内存需求,INSTANCE_MEMORY 参数应该被设置成 AUTOMATIC,或降低到 DB2 在系统中能使用的内存范围。

一个确定的 INSTANCE_MEMORY 值对系统而言太高的话可在另外的数据库启动之前可能不会出现问题,把 DB2 的整个分配高于系统可以调整不过仍然在 INSTANCE_MEMORY 之内。


因为 STMM 被设计来处理内存压力,在需要的时候释放内存给操作系统,如果没有启动 STMM 这种情况会经常发生,或者涉及的系统(如 Solaris)不支持内存释放回操作系统,或当数据库内存需求非常动态(如,很快的创建 / 销毁数据库连接,或者数据库活跃很短周期,等。)

如果数据库有非常大的连接需求,这可能导致实例的很大一部分内存被代理程序消耗。如果总量过多 - 留给数据库全局内存太少,无论有没有启动 STMM- 它都可以通过使用连接集中器来减少内存消耗。

‘懒惰系统’瓶颈

System Bottleneck > Lazy System

第四,也是最有意思的一类瓶颈,我们接下来一起来看一下‘懒惰系统’瓶颈。这表现为在前面几个瓶颈可能都不存在。没有(明显的)CPU,磁盘或者内存(或者网络,或…)瓶颈,系统也不忙。

在 ‘懒惰系统中’一个最常见的原因是锁争抢。幸运的是,锁争抢是很容易在快照数据中被检查到的。快照元素 lock_wait_time 和 locks_waiting 通过 sysibmadm.snapdb 分别显示总的锁等待时间和当前在等待锁的代理进程数,活动代理等待锁的百分比很高(如,20% 或者更高)与 / 或锁等待的时间增加是发生瓶颈的明显迹象。

System Bottleneck > Lazy System > Lock Wait

虽然不能判断每个语句的锁等待时间,但是通过动态 SQL 语句快照和语句事件监控器中被延长的执行时间、相关的 CPU 消耗以及 IO 活动,通常还是可以合理的判断出语句收到锁等待影响的时间。也就是说,应用程序快照同样报告了应用程序的锁等待时间,这对缩小在系统范围内引起锁等待的可能性的范围来说非常有用。我们可以从 sysibmadm.snaplockwait 视图中得到更多的锁等待信息。它显示:

锁类型 - 共享锁或排它锁

对像类型 – 行,表,等。

持有者和请求者的代理进程 ID

注意,不像其它许多 DB2 快照监控数据 , 锁的信息的存在周期是非常短暂的。除了 lock_wait_time 是总共的,其它大多数锁的信息在锁释放后也释放了。因此,在一段时间内周期性搜集锁和锁等待快照非常很重要,连续的场景也更容易被理解。像前面所介绍的,分析大量快照数据的最佳实践是通过管理视图并把它存入 DB2 。这尤其对于来自 snaplockwait 的数据是这样,它由应用程序数据,数据库和锁快照组成,并且不能通过快照命令得到。

虽然不像其它快照类型,与仅通过锁监控开关启用快照功能相比,锁快照的总开销是抓取快照本身。所以,虽然抓取快照并存入 DB2 很平常,但是过于频繁的快照会对它自己造成瓶颈。

有很多方法有助于降低锁争抢和锁等待时间

如果可能,尽可能的避免运行时间过长的事务和 WITH HOLD 游标。持有锁的时间越长,与其它应用程序发生锁争抢的可能性就越大。

要避免取得比实际需要更大的结果集,尤其是 REPEATABLE READ 隔离级别。简单的说,涉及的行数越多意味着持有更多的锁,而且有更多的机会运行到别人持有的锁。在实际情况下,这常常意味着降低 SELECT 的 WHERE 子句对行的选择标准,而不是返回更多的行却在应用程序里过滤它。

图 3. 例子
DB2 最佳实践: 性能调优和问题诊断最佳实践,第 2 部分:有条不紊地进行性能调优和故障诊断

图片看不清楚?请点击这里查看原图(大图)。

避免使用比实际需要更高的隔离级别。可重复读或许在应用程序中保护结果集完整性时是必需的,然而它也会在持有锁以及潜在的锁冲突方面造成额外的开销。

如果应用程序的商业逻辑合理,考虑到通过db2_evaluncommitted,db2_skipdeleted, anddb2_skipinserted来更改锁的行为。这些设置让 DB2 可以推迟或避免在某些情况下产生锁,因而降低争抢并潜在的提高吞吐量。

锁升级也会成为发生争抢的主要原因。反之,经过良好设计的应用程序持有的个别行锁或许不会发生冲突,锁升级导致的块或表级别的锁常常会导致对象串行化以及严重的性能问题。数据库快照报告了一个全局的锁升级的总和(sysibmadm.snapdb.lock_escals)。通过检查写入 db2diag.log 中的消息(DIAGLEVEL 3),当锁升级发生的时候这很容易确定是哪个表上的升级 。

当一个应用程序消耗了他被允许的那一部分锁列表(取决于数据库配置参数 MAXLOCKS,它表现为锁列表大小的百分比),锁升级就被触发。因此增加 MAXLOCKS 和 / 或锁列表可以降低锁升级的频率。同样,如上面提到的,降低应用程序持有的锁数目(通过增加提交频率,降低隔离级别,等)将有助于减少锁升级。

System Bottleneck > Lazy System > Deadlocks and Lock Timeout

当锁等待的时间成为十分微妙的瓶颈的时候,死锁和锁超问题时就很难被忽略了,因为它们俩都对应用程序返回负的 SQL 码。虽然许多应用程序会简单的重试失败事务没有报出死锁并最终取得成功。在这种情况下能够最直接反映潜在死锁问题的是在 sysibmadm.snapdb 管理视图中的死锁监控元素。如上面提到的,我们建议把这作为搜集日常操作监控数据的一部分。

死锁的成本有所不同,它的成本直接和回滚的事务成正比。同样,每 1000 笔事务发生死锁次数超过一次通常意味着有问题。

死锁的频率有时可以很容易降低,通过保证所有应用程序以相同的顺序访问它们的数据 - 例如,访问(并且也锁定)行在表 Table A 中 , 接着是 Table B,接着是 Table C,等。如果两个应用程序以不同的顺序在相同对像上持有互斥的锁,它们发生死锁的风险会很大。

默认的死锁事件监控器db2detaildeadlock 将记录所有死锁信息并存在 deftdbpath(数据库管理器默认数据库路径),例如在 <dftdbpath>/NODE0000/SQL00001/db2event/db2detaildeadlock.

像所有事件监控器一样,它会带来少量的额外开销,但是能跟踪死锁带来的好处超过了这小小的性能降低。

锁超时对系统而言具有同死锁相同的破坏力。因为普通的死锁事件监控器不会跟踪锁超时,我们需要另外一个机制。 DB2 9.5 提供了一个技术用来产生一个基于文本关于锁超时的报告,它基于死锁事件监控器,在引擎中增加了其它基础构造。比起之前的版本,这极大的简化了锁超时的诊断。产生锁超时报告的流程在 developerworks:“New options for analyzing lock timeouts in DB2 9.5 ”中有描述。

System Bottleneck > Lazy System > Insufficient Prefetching ?

比起代理程序自己读取数据,DB2 预取程序读取数据查询大量的数据对磁盘进行连续读执行的效率要高很多。这有多种原因 ,

比如预取程序每次读取多个页面,读取的大小是数据库或表空间预取值,而代理程序一次只读取一个数据页。

代理程序可以在预取程序工作时执行一部分查询,减少了计算和 I/O 的串行化。

多个预取程序可以每个都分配读取一部分页面,达到 I/O 并行性。

当代理程序将需要一个页面范围的数据的时候,它会排队提出预取的请求。当代理程序需要要使用一个页面的时候,如果预取程序还没有开始它的 I/O(就是说,如果他还没有最终被预取程序取到,或如果这个请求还在预取队列),代理程序将自己读取那个页面。这会减少代理程序等待预取程序的频率(它将之等待实际进行中的 I/O)。然而,如果我们像这样回到使用代理程序 I/O,预取的所有好处都不复存在。

这种问题的症状包括:

一个大的查询语句低于 100% 的‘预取率’。(根据在数据库或者缓冲池层面,目标值会降低,基于它的那些活动不是基于扫描的。)我们设置这个值的度量类似于缓冲池命中率,不过在这里是以预取完成的物理读和总的物理读想比来计算的。 100% * (pool_data_p_reads – async_data_reads) / pool_data_p_reads

这样可以在数据库层面通过对 sysibmadm.snapdb、或者通过缓冲池层面的 sysibmadm.snapbp、在动态 SQL 语句层面的 namic SQL statement level with 计算

在 sysibmadm.snapdb 和 sysibmadm.snapappl 中的 prefetch_wait_time 显示较高并且不断攀升的‘花费在预取等待的时间’。如在上面所提到的,代理进程只等待实际上‘正在运行’的预取 I/O 。

类似于其它的“懒惰系统”问题,我们通常总会从 vmstat&perfmon 看见很高的空闲。不过 I/O 等待时间可能增加,因为代理进程读取单个页面的效率要远远少于预取进行大块的读取。但是即使如此,I/O 等待也不大可能爬升到足以造成瓶颈。

这个问题的最大可能性是预取器的数目(数据库配置参数 NUM_IOSERVERS)太少。在 DB2 v9 及以后可以有 AUTOMATIC 设置,而且后来使用像表空间并行这样的元素等,来计算预取器的个数,一般情况下不再需要调整。不过,在低预取率的时候调整显得还是必要的,流程如下:

判断是否所有的预取器花费大致等于 CPU 时间。这在 DB2 v9 或之前的版本上可以通过的 ps 命令,或者在 db2 v9.5 及以后版本使用 db2pd – edu 来实现。如果有一些预取器消耗了比其它预取器少很多的 CPU,那么说明已经有足够多(可能过多)的预取器。(如果有超过一对‘空闲’预取器,你可以慢慢减少 NUM_IOSERVERS,不过有多余的预取器并不是问题。)

通过 10% 增加 NUM_IOSERVERS 。让系统在有大量预取器的情况下可以正常运行。如果不能提高繁重查询的预取率,那么我对我这个问题的判断不正确,而且 NUM_IOSERVERS 应该被设回原始设置。

重复这个流程直到你找到预取器在这个系统上合适的级别。

如果预取仍然低于同等操作水平,就非常需要验证 prefetchsize 是否被正确设置。DB2 Information Center对 于对这个验证流程已经进行了详细的讨论,我们就不再这里重复了。

System Bottleneck > Lazy System > Insufficient Page Cleaning?

类似于预取的另一个关于缓冲池页面清除的问题,如果强制代理进程终止它们的正常处理来执行 I/O,则通常应该有一个 DB2 的‘工作线程’来处理。然而在这种情况下,代理进程不得不进行写操作(更改页面)而非读取。这常常会涉及到类似‘页清除操作’。

应该说这个症状和上面老套的‘预取缺乏’不大一样。在一个有很多并发 DB2 代理进程的线事务处理(OLTP)环境中,缺少页面清除会导致更多的问题。如果它们不能找到干净的缓冲页就不得不自己进行页清除,这可能潜在的造成很多额外的单个页面写入容器。这意味着在这种情况下,我们可能看到一个 I/O 瓶颈,而不是一个通常意义上的‘懒惰系统’。发生的次数取决于连接的数目,页面清除程序的性能,等等。

一个相关症状是 ‘爆炸性的’系统活跃,如在 vmstat 中看到的。系统可能在短时间内运行很好,代理进程工作正常,在接下来的一段时间大多数代理进程会被阻塞,并自己刷新一个脏页面到磁盘。这将在 vmstat 中显示为高 I/O 等待和代理进程运行队列段时间空闲。等代理进程完成了页清除,性能又恢复如常 - 这将周期性重复。

在 DB2 ’ s 监控数据中,页清除的次数(在 sysibmadm.snapdb 中 pool_drty_pg_steal_clns)是是否出现问题最佳指示器。我们通常希望在一个流畅运行的系统中很少发生页清除操作,因此页面清除次数的任何异常的增长都由于某些原因导致的。

如果页清除下降并且发生换页操作,要检查的第一件事就是页面清除程序的数目(数据库配置参数 NUM_IOCLEANERS.)DB2 9 和之后的版本支持 AUTOMATIC 设置,这是遵循当前分区中每颗处理器一个页面清除程序的最佳实践。注意,在 DB2 9.5 中超过推荐值得多余的页面清楚程序会最终有损于性能。

在 DB2 8.2 中 DB2 支持两类页清除程序 - ‘典型’被动页清除程序(默认),和主动页清除程序。

典型的页面清除程序是受到两个 DB2 配置参数控制的

CHAGPGS_THRESH – 判断用于激活页面清除程序的已更改缓冲池页面的百分比。

SOFTMAX – 限制在缓冲池中最新更改页面与最老的已更改页面的 LSN 差距,以控制恢复时间。

减少它们中的任意一个通常都会使页面清除更有侵略性,不过要影响在缓冲池中干净页面的数目,CHNGPGS_THRESH 是首选的方法。降低 CHNGPGS_THRESH 或许可以帮助减少换页的次数,并且稳定起伏的页面清除。注意,这个参数设置过低会导致过多的磁盘写入,因此应该被设置为刚好能避免换页的程度。

主动页面清除(也就是熟知的轮流换页,或 APC)通过使用注册表变量 DB2_USE_ALTERNATE_PAGE_CLEANING 来启用。这不同于‘典型’的页面清除程序,在典型页清除中它调整它的清除比例来维持期望的 LSN 差距。比起清除被‘开’或‘关’、触发或不触发,APC 可以阻止它被激活以避免典型页面清除在某些时候的‘爆炸性’行为。和典型页面清除类似,减少 SOFTMAX 也有效的增加了页面清除的频率,并减少了换页。注意,如果系统之前是基于命中 CHNGPGS_THRESH 来清除页面的话,APC 则只受 SOFTMAX 控制。(例如,脏页阀值触发器。)

System Bottleneck > Lazy System > Application side problem?

客户端应用程序和 DB2 服务器之间的请求以及前端与后端的响应和同步流,都意味著它们都是整个系统性能的角色之一。例如,在一批应用程序的运行时中的增加请求数,可能会导致系统缓慢,不过这也可能是由于应用程序对 DB2 的请求成功率下降的原故。这类问题的症状和 ‘懒惰系统’非常接近的模式。

对 DB2 的请求成功率减少的症状包括:

在应用程序中‘ UOW wait ’状态的代理进程数目增加(在 sysibmadm.snapappl_info 中的 appl_status )- 意味着它们等待的时间多于工作时间。

请求到达代理进程的时间增加(sysibmadm.snapappl_info 中的 status_change_time)

客户端发起请求的时间间隔增加,比如在语句事件监控器中,或 CLI 以及 JDBC trace 中看到的。 CLI 和 JDBC 跟踪抓取客户端的 API 请求,以及记录请求发起的时间戳。虽然客户端 trace 的开销很大,不过它们有对包括网络响应时间计时的好处,以及搜集其它 DB2 引擎外部的因素。

如果有应用程序端度量标准,比如商业层事务吞吐量或响应时间可能表现为变慢。

如果应用程序端变慢则显示有问题,可能的原因包括

部署了一个新版的应用程序

一个在客户端和服务器之间的网络瓶颈

客户端系统负载过大– 例如太多用户或太多应用程序的副本在运行。

对 DB2 的请求成功率减少的症状包括:

在应用程序中‘ UOW wait ’状态的代理进程数目增加(在 sysibmadm.snapappl_info 中的 appl_status )- 意味着它们等待的时间多于工作时间。

请求到达代理进程的时间增加(sysibmadm.snapappl_info 中的 status_change_time)

客户端发起请求的时间间隔增加,比如在语句事件监控器中,或 CLI 以及 JDBC trace 中看到的。 CLI 和 JDBC 跟踪抓取客户端的 API 请求,以及记录请求发起的时间戳。虽然客户端 trace 的开销很大,不过它们有对包括网络响应时间计时的好处,以及搜集其它 DB2 引擎外部的因素。

如果有应用程序端度量标准,比如商业层事务吞吐量或响应时间可能表现为变慢。

如果应用程序端变慢则显示有问题,可能的原因包括

部署了一个新版的应用程序

一个在客户端和服务器之间的网络瓶颈

客户端系统负载过大– 例如太多用户或太多应用程序的副本在运行。


图 4. 系统瓶颈 - 总图
DB2 最佳实践: 性能调优和问题诊断最佳实践,第 2 部分:有条不紊地进行性能调优和故障诊断

图片看不清楚?请点击这里查看原图(大图)。

局部 vs. 系统范围的问题诊断

到现在为止,我们已经处理了系统中的整体性能问题 – 高层磁盘、CPU、内存和懒惰系统问题。但是性能问题并不总是以这样的形式出现。通常,整个系统运行正常,不过有一个用户或应用程序,或存储过程,或一个 SQL 语句 – 出现了问题。处理小范围的问题和系统范围的性能问题有什么不同?

一旦我们确定了一个或多个问题 SQL 语句,以及我们了解它们所面对的瓶颈,我们就可以应用多种在前面章节讨论的方法。尤其是涉及挖掘‘ hot SQL statements ’、hot table 的技术 – 我们关注在定位问题中涉及的因素。最佳实践:

配置:

在物理磁盘的数目方面确保充足的磁盘能力

在专门的磁盘上存放本地事务日志

为了数据仓库中部署超过 300GB 的数据使用 DB2 数据分区功能

对于 Unicode 的最佳性能考虑语言感知

对就像 SAP 一样的 ISV 应用程序,遵循厂商的配置建议

使用 DB2 自动配置以获得良好的初始配置设置

STMM 和其它自动维护提供了稳定而强大的性能

对 DPF 环境,使用一个本地文件系统要比 NFS-mounted 文件系统作为 DIAGPATH 更好。

监控:

搜集普通的基本操作监控数据,因此在出现问题的情况下可以使用背景信息

使用管理视图来访问并使用 SQL 操作监控数据

也监控非 DB2 的度量,比如 CPU 使用和应用程序端的响应时间

对配置和环境设置中的更改保持跟踪

问题诊断:

系统的 - 一次只做一次更改,并仔细观察结果

从最高级别症状开始 – 比如 CPU、磁盘或内存瓶颈 – 以求在早期救排除不可能的原因。

利用每一步来提炼挖掘可能的原因 – 例如 I/O 瓶颈可能是由于容器 C 导致的,这可能是 T 表导致的,而 T 表可能是由于语句 S 效率极差。

不要仅根据‘直觉’对系统进行更改 - 要确定理解你准备解决的问题是如何产生你看到的症状的。

对系统范围的问题和更小范围的问题都同样从头到尾使用系统方法。

幸运的是,在本文中提出的诊断性能问题方法论用在应用程序上也一样,不管是普遍的还是特定问题。我们所需要做的就是抽取系统可以提供的监控数据的相关部分。

假设我们有一个应用程序,它运行在我们期望的级别之下。在我们可以开始诊断问题之前,需要在系统上定位这个应用程序的范围

1 .了解应用程序名字和应用程序使用的授权 ID,LIST APPLICATIONS 命令告诉我们‘ appl ID ’(例如,LOCAL.srees.0804250311139),这是定位这个应用程序详细监控数据的关键。

2 .对于特定应用程序监控数据,应用程序快照是一个极好的资源,而且通过指定刚才得到的 appl ID,我们可以专注于 我们感兴趣的连接上。

db2 get snapshot for application applid '*LOCAL.srees.080425031139' 

在这里(或从 sysibmadm.snapappl 和 sysibmadm.snapapplinfo),我们可以判断很多关于应用程序的重要信息,比如在抓取快照时的正在执行的语句、缓冲池命中率、排序总时间、选择的行和读取的行的比例,以及 CPU 和花费的时间。在排序中,我们可以得到了很多和我们用在诊断系统级别问题相同的信息,然而在这种情况下只侧重我们关注的信息。

3 .为了深入研究,我们也可以使用在语句事件监控器中的应用程序 ID 作为一个 WHERE 子句的子句,只专注于我们工作的这个应用程序搜集的事件监控信息。这将向我们提供应用程序的每条语句执行时间、缓冲池和 CUP 消耗信息。

虽然我们对改变全局 CPU 消耗或磁盘活动(不要忘记,整体很好)并不关注,但是理解状况是否发生在运行中的哪个应用程序却仍然十分重要。如果系统是 CPU 受限,而且我们的应用程序是 CPU 饥饿状态,则它的性能将会受到影响。类似,磁盘活跃情况也一样。

在收集了很多应用程序快照、事件监控的跟踪后,我们现在几乎拥有和系统范围问题一样的监控数据。我们的基本目标就是判断我们应该把时间花费在应用程序的什么地方 – 这也是瓶颈所在。应用程序中的哪些 SQL 语句运行时间最长?哪些语句消耗了绝大多数 CPU,或导致了绝大部分的磁盘 I/O ?模仿我们在系统范围的判断树来回答这些问题。

总结和结论

本文考虑了 3 个关键范围,它们对于在理解尝试避免你的系统性能降低时候非常重要:配置、监控和性能诊断。

我们的建议包括硬件和软件配置,它们可以帮助你确保良好的系统性能。我们讨论了很多监控技术这将帮助你在操作方面和问题诊断方面理解系统性能。同样为了有步骤的,有条不紊的处理问题,我们展示了一批 DB2 性能诊断的最佳实践。

如果你的系统配置恰当而且监控良好,你就可以有效的解决可能出现的性能问题,因此减少总的拥有成本并提高你的业务的投资回报。

Tags:DB 最佳 实践

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接