×ðÁú¿­Ê±¹ÙÍøµÇ¼

dzÎö Linux ÖеÄÁ㿽±´ÊÖÒÕ

±¾ÎÄ̽ÌÖLinuxÖÐ Ö÷ÒªµÄ¼¸ÖÖÁ㿽±´ÊÖÒÕ ÒÔ¼°Á㿽±´ÊÖÒÕ ÊÊÓõij¡¾°  ¡£ÎªÁËѸËÙ½¨ÉèÆðÁ㿽±´µÄ¿´·¨ £¬ÎÒÃÇÄÃÒ»¸ö³£Óõij¡¾°¾ÙÐÐÒýÈ룺

ÒýÎÄ

ÔÚдһ¸öЧÀͶ˳ÌÐòʱ£¨Web Server»òÕßÎļþЧÀÍÆ÷£© £¬ÎļþÏÂÔØÊÇÒ»¸ö»ù±¾¹¦Ð§ ¡£Õâʱ¼äЧÀͶ˵ÄʹÃüÊÇ£º½«Ð§ÀͶËÖ÷»ú´ÅÅÌÖеÄÎļþ²»×öÐ޸ĵشÓÒÑÅþÁ¬µÄsocket·¢³öÈ¥ £¬ÎÒÃÇͨ³£ÓÃÏÂÃæµÄ´úÂëÍê³É£º

while((n = read(diskfd, buf, BUF_SIZE)) > 0)
    write(sockfd, buf , n);

µÇ¼ºó¸´ÖÆ

»ù±¾²Ù×÷¾ÍÊÇÑ­»·µÄ´Ó´ÅÅ̶ÁÈëÎļþÄÚÈݵ½»º³åÇø £¬ÔÙ½«»º³åÇøµÄÄÚÈÝ·¢Ë͵½socket ¡£¿ÉÊÇÓÉÓÚLinuxµÄI/O²Ù×÷ĬÈÏÊÇ»º³åI/O ¡£ÕâÄÚÀïÖ÷ҪʹÓõÄÒ²¾ÍÊÇreadºÍwriteÁ½¸öϵͳŲÓà £¬ÎÒÃDz¢²»ÖªµÀ²Ù×÷ϵͳÔÚÆäÖÐ×öÁËʲô ¡£ÏÖʵÉÏÔÚÒÔÉÏI/O²Ù×÷ÖÐ £¬±¬·¢Á˶à´ÎµÄÊý¾Ý¿½±´ ¡£

µ±Ó¦ÓóÌÐò»á¼ûij¿éÊý¾Ýʱ £¬²Ù×÷ϵͳÊ×ÏÈ»á¼ì²é £¬ÊDz»ÊÇ×î½ü»á¼û¹ý´ËÎļþ £¬ÎļþÄÚÈÝÊÇ·ñ»º±£´æÄں˻º³åÇø £¬ÈôÊÇÊÇ £¬²Ù×÷ϵͳÔòÖ±½Óƾ֤readϵͳŲÓÃÌṩµÄbufµØµã £¬½«Äں˻º³åÇøµÄÄÚÈÝ¿½±´µ½bufËùÖ¸¶¨µÄÓû§¿Õ¼ä»º³åÇøÖÐÈ¥ ¡£ÈôÊDz»ÊÇ £¬²Ù×÷ϵͳÔòÊ×ÏȽ«´ÅÅÌÉϵÄÊý¾Ý¿½±´µÄÄں˻º³åÇø £¬ÕâÒ»²½ÏÖÔÚÖ÷ÒªÒÀÀµDMAÀ´´«Êä £¬È»ºóÔÙ°ÑÄں˻º³åÇøÉϵÄÄÚÈÝ¿½±´µ½Óû§»º³åÇøÖÐ ¡£

½ÓÏÂÀ´ £¬writeϵͳŲÓÃÔÙ°ÑÓû§»º³åÇøµÄÄÚÈÝ¿½±´µ½ÍøÂç¿ÍÕ»Ïà¹ØµÄÄں˻º³åÇøÖÐ £¬×îºósocketÔÙ°ÑÄں˻º³åÇøµÄÄÚÈÝ·¢Ë͵½Íø¿¨ÉÏ ¡£ËµÁËÕâô¶à £¬²»È翴ͼÇåÎú£º

Êý¾Ý¿½±´

´ÓÉÏͼÖпÉÒÔ¿´³ö £¬¹²±¬·¢ÁËËÄ´ÎÊý¾Ý¿½±´ £¬×ÝȻʹÓÃÁËDMAÀ´´¦ÀíÁËÓëÓ²¼þµÄͨѶ £¬CPUÈÔÈ»ÐèÒª´¦ÀíÁ½´ÎÊý¾Ý¿½±´ £¬Óë´Ëͬʱ £¬ÔÚÓû§Ì¬ÓëÄÚºË̬Ҳ±¬·¢Á˶à´ÎÉÏÏÂÎÄÇл» £¬ÎÞÒÉÒ²¼ÓÖØÁËCPU¼ç¸º ¡£

ÔÚ´ËÀú³ÌÖÐ £¬ÎÒÃÇûÓжÔÎļþÄÚÈÝ×öÈκÎÐÞ¸Ä £¬ÄÇôÔÚÄں˿ռäºÍÓû§¿Õ¼äÍù·µ¿½±´Êý¾ÝÎÞÒɾÍÊÇÒ»ÖÖÆÌÕÅ £¬¶øÁ㿽±´Ö÷Òª¾ÍÊÇΪÏàʶ¾öÕâÖÖµÍЧÐÔ ¡£

ʲôÊÇÁ㿽±´ÊÖÒÕ£¨zero-copy£©£¿

Á㿽±´Ö÷ÒªµÄʹÃü¾ÍÊÇ×èÖ¹CPU½«Êý¾Ý´ÓÒ»¿é´æ´¢¿½±´µ½ÁíÍâÒ»¿é´æ´¢ £¬Ö÷Òª¾ÍÊÇʹÓÃÖÖÖÖÁ㿽±´ÊÖÒÕ £¬×èÖ¹ÈÃCPU×ö´ó×ÚµÄÊý¾Ý¿½±´Ê¹Ãü £¬ïÔÌ­²»ÐëÒªµÄ¿½±´ £¬»òÕßÈñðµÄ×é¼þÀ´×öÕâÒ»Àà¼òÆÓµÄÊý¾Ý´«ÊäʹÃü £¬ÈÃCPU½âÍѳöÀ´×¨×¢ÓÚ±ðµÄʹÃü ¡£ÕâÑù¾Í¿ÉÒÔÈÃϵͳ×ÊÔ´µÄʹÓÃÔ½·¢ÓÐÓà ¡£

ÎÒÃǼÌÐø»Øµ½ÒýÎÄÖеÄÀý×Ó £¬ÎÒÃÇÔõÑùïÔÌ­Êý¾Ý¿½±´µÄ´ÎÊýÄØ£¿Ò»¸öºÜÏÔ×ŵÄ×ÅÁ¦µã¾ÍÊÇïÔÌ­Êý¾ÝÔÚÄں˿ռäºÍÓû§¿Õ¼äÍù·µ¿½±´ £¬ÕâÒ²ÒýÈëÁËÁ㿽±´µÄÒ»¸öÀàÐÍ£º

ÈÃÊý¾Ý´«Êä²»ÐèÒª¾­ÓÉ user space ¡£

ʹÓà mmap

ÎÒÃÇïÔÌ­¿½±´´ÎÊýµÄÒ»ÖÖÒªÁìÊÇŲÓÃmmap()À´È¡´úreadŲÓãº

buf = mmap(diskfd, len);
write(sockfd, buf, len);

µÇ¼ºó¸´ÖÆ

Ó¦ÓóÌÐòŲÓÃmmap() £¬´ÅÅÌÉϵÄÊý¾Ý»áͨ¹ýDMA±»¿½±´µÄÄں˻º³åÇø £¬½Ó×ŲÙ×÷ϵͳ»á°ÑÕâ¶ÎÄں˻º³åÇøÓëÓ¦ÓóÌÐò¹²Ïí £¬ÕâÑù¾Í²»ÐèÒª°ÑÄں˻º³åÇøµÄÄÚÈÝÍùÓû§¿Õ¼ä¿½±´ ¡£Ó¦ÓóÌÐòÔÙŲÓÃwrite(),²Ù×÷ϵͳֱ½Ó½«Äں˻º³åÇøµÄÄÚÈÝ¿½±´µ½socket»º³åÇøÖÐ £¬ÕâÒ»Çж¼±¬·¢ÔÚÄÚºË̬ £¬×îºó £¬socket»º³åÇøÔÙ°ÑÊý¾Ý·¢µ½Íø¿¨È¥ ¡£Í¬ÑùµÄ £¬¿´Í¼ºÜ¼òÆÓ£º

mmap

ʹÓÃmmapÌæ»»readºÜÏÔ×ÅïÔÌ­ÁËÒ»´Î¿½±´ £¬µ±¿½±´Êý¾ÝÁ¿ºÜ´óʱ £¬ÎÞÒÉÌáÉýÁËЧÂÊ ¡£¿ÉÊÇʹÓÃmmapÊÇÓмÛÇ®µÄ ¡£µ±ÄãʹÓÃmmapʱ £¬Äã¿ÉÄÜ»áÓöµ½Ò»Ð©Òþ²ØµÄÏÝÚå ¡£ÀýÈç £¬µ±ÄãµÄ³ÌÐòmapÁËÒ»¸öÎļþ £¬¿ÉÊǵ±Õâ¸öÎļþ±»ÁíÒ»¸öÀú³Ì½Ø¶Ï(truncate)ʱ, writeϵͳŲÓûáÓÉÓÚ»á¼û²»·¨µØµã¶ø±»SIGBUSÐźÅÖÕÖ¹ ¡£SIGBUSÐźÅĬÈÏ»áɱËÀÄãµÄÀú³Ì²¢±¬·¢Ò»¸öcoredump,ÈôÊÇÄãµÄЧÀÍÆ÷ÕâÑù±»ÖÐÖ¹ÁË £¬Äǻᱬ·¢Ò»±ÊËðʧ ¡£

ͨ³£ÎÒÃÇʹÓÃÒÔϽâ¾ö¼Æ»®×èÖ¹ÕâÖÖÎÊÌ⣺

1. ΪSIGBUSÐźŽ¨ÉèÐźŴ¦Àí³ÌÐò

µ±Óöµ½SIGBUSÐźÅʱ £¬ÐźŴ¦Àí³ÌÐò¼òÆӵطµ»Ø £¬writeϵͳŲÓÃÔÚ±»ÖÐֹ֮ǰ»á·µ»ØÒѾ­Ð´ÈëµÄ×Ö½ÚÊý £¬²¢ÇÒerrno»á±»ÉèÖóÉsuccess,¿ÉÊÇÕâÊÇÒ»ÖÖÔã¸âµÄ´¦Àí²½·¥ £¬ÓÉÓÚÄ㲢ûÓнâ¾öÎÊÌâµÄʵÖʽ¹µã ¡£

2. ʹÓÃÎļþ×â½èËø

ͨ³£ÎÒÃÇʹÓÃÕâÖÖÒªÁì £¬ÔÚÎļþÐÎò·ûÉÏʹÓÃ×â½èËø £¬ÎÒÃÇΪÎļþÏòÄÚºËÉêÇëÒ»¸ö×â½èËø £¬µ±ÆäËüÀú³ÌÏëÒª½Ø¶ÏÕâ¸öÎļþʱ £¬Äں˻áÏòÎÒÃÇ·¢ËÍÒ»¸öʵʱµÄRTSIGNALLEASEÐźŠ£¬¸æËßÎÒÃÇÄÚºËÕýÔÚÆÆËðÄã¼Ó³ÖÔÚÎļþÉϵĶÁдËø ¡£ÕâÑùÔÚ³ÌÐò»á¼û²»·¨ÄÚ´æ²¢ÇÒ±»SIGBUSɱËÀ֮ǰ £¬ÄãµÄwriteϵͳŲÓûᱻÖÐÖ¹ ¡£write»á·µ»ØÒѾ­Ð´ÈëµÄ×Ö½ÚÊý £¬²¢ÇÒÖÃerrnoΪsuccess ¡£

ÎÒÃÇÓ¦¸ÃÔÚmmapÎļþ֮ǰ¼ÓËø £¬²¢ÇÒÔÚ²Ù×÷ÍêÎļþºó½âËø£º

if(fcntl(diskfd, F_SETSIG, RT_SIGNAL_LEASE) == -1) {
    perror("kernel lease set signal");
return -1;
}
/* l_type can be F_RDLCK F_WRLCK  ¼ÓËø*/
/* l_type can be  F_UNLCK ½âËø*/
if(fcntl(diskfd, F_SETLEASE, l_type)){
    perror("kernel lease set type");
return -1;
}

µÇ¼ºó¸´ÖÆ

ʹÓÃsendfile

´Ó2.1°æÄÚºË×îÏÈ £¬LinuxÒýÈëÁËsendfileÀ´¼ò»¯²Ù×÷:

#include<sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

µÇ¼ºó¸´ÖÆ

ϵͳŲÓÃsendfile()ÔÚ´ú±íÊäÈëÎļþµÄÐÎò·ûinfdºÍ´ú±íÊä³öÎļþµÄÐÎò·ûoutfdÖ®¼ä´«ËÍÎļþÄÚÈÝ£¨×Ö½Ú£© ¡£ÐÎò·ûoutfd±ØÐèÖ¸ÏòÒ»¸öÌ×½Ó×Ö £¬¶øinfdÖ¸ÏòµÄÎļþ±ØÐèÊÇ¿ÉÒÔmmapµÄ ¡£ÕâЩ¾ÖÏÞÏÞÖÆÁËsendfileµÄʹÓà £¬Ê¹sendfileÖ»Äܽ«Êý¾Ý´ÓÎļþת´ïµ½Ì×½ÖÉ×ÓÏ £¬·´Ö®Ôò²»¿É ¡£

ʹÓÃsendfile²»µ«ïÔÌ­ÁËÊý¾Ý¿½±´µÄ´ÎÊý £¬»¹ïÔÌ­ÁËÉÏÏÂÎÄÇл» £¬Êý¾Ý´«ËÍʼÖÕÖ»±¬·¢ÔÚkernel space ¡£

sendfileϵͳŲÓÃÀú³Ì

ÔÚÎÒÃÇŲÓÃsendfileʱ £¬ÈôÊÇÓÐÆäËüÀú³Ì½Ø¶ÏÁËÎļþ»á±¬·¢Ê²Ã´ÄØ£¿¼ÙÉèÎÒÃÇûÓÐÉèÖÃÈκÎÐźŴ¦Àí³ÌÐò £¬sendfileŲÓýö½ö·µ»ØËüÔÚ±»ÖÐֹ֮ǰÒѾ­´«ÊäµÄ×Ö½ÚÊý £¬errno»á±»ÖÃΪsuccess ¡£ÈôÊÇÎÒÃÇÔÚŲÓÃsendfile֮ǰ¸øÎļþ¼ÓÁËËø £¬sendfileµÄÐÐΪÈÔÈ»ºÍ֮ǰÏàͬ £¬ÎÒÃÇ»¹»áÊÕµ½RTSIGNALLEASEµÄÐźÅ ¡£

ÏÖÔÚΪֹ £¬ÎÒÃÇÒѾ­ïÔÌ­ÁËÊý¾Ý¿½±´µÄ´ÎÊýÁË £¬¿ÉÊÇÈÔÈ»±£´æÒ»´Î¿½±´ £¬¾ÍÊÇÒ³»º´æµ½socket»º´æµÄ¿½±´ ¡£ÄÇôÄܲ»¿É°ÑÕâ¸ö¿½±´Ò²Ê¡ÂÔÄØ£¿

½èÖúÓÚÓ²¼þÉϵÄ×ÊÖú £¬ÎÒÃÇÊÇ¿ÉÒÔ°ìµ½µÄ ¡£Ö®Ç°ÎÒÃÇÊÇ°ÑÒ³»º´æµÄÊý¾Ý¿½±´µ½socket»º´æÖÐ £¬ÏÖʵÉÏ £¬ÎÒÃǽö½öÐèÒª°Ñ»º³åÇøÐÎò·û´«µ½socket»º³åÇø £¬ÔÙ°ÑÊý¾Ý³¤¶È´«ÒÑÍù £¬ÕâÑùDMA¿ØÖÆÆ÷Ö±½Ó½«Ò³»º´æÖеÄÊý¾Ý´ò°ü·¢Ë͵½ÍøÂçÖоͿÉÒÔÁË ¡£

×ܽáһϠ£¬sendfileϵͳŲÓÃʹÓÃDMAÒýÇ潫ÎļþÄÚÈÝ¿½±´µ½Äں˻º³åÇøÈ¥ £¬È»ºó½«´øÓÐÎļþλÖúͳ¤¶ÈÐÅÏ¢µÄ»º³åÇøÐÎò·ûÌí¼Ósocket»º³åÇøÈ¥ £¬ÕâÒ»²½²»»á½«ÄÚºËÖеÄÊý¾Ý¿½±´µ½socket»º³åÇøÖÐ £¬DMAÒýÇæ»á½«Äں˻º³åÇøµÄÊý¾Ý¿½±´µ½Ð­ÒéÒýÇæÖÐÈ¥ £¬×èÖ¹ÁË×îºóÒ»´Î¿½±´ ¡£

´øDMAµÄsendfile

²»¹ýÕâÒ»ÖÖÍøÂ翽±´¹¦Ð§ÊÇÐèÒªÓ²¼þÒÔ¼°Çý¶¯³ÌÐòÖ§³ÖµÄ ¡£

ʹÓÃsplice

sendfileÖ»ÊÊÓÃÓÚ½«Êý¾Ý´ÓÎļþ¿½±´µ½Ì×½ÖÉ×ÓÏ £¬ÏÞÖÆÁËËüµÄʹÓùæÄ£ ¡£LinuxÔÚ2.6.17°æ±¾ÒýÈëspliceϵͳŲÓà £¬ÓÃÓÚÔÚÁ½¸öÎļþÐÎò·ûÖÐÒƶ¯Êý¾Ý£º

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include<fcntl.h>
ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsignedint flags);

µÇ¼ºó¸´ÖÆ

spliceŲÓÃÔÚÁ½¸öÎļþÐÎò·ûÖ®¼äÒƶ¯Êý¾Ý £¬¶ø²»ÐèÒªÊý¾ÝÔÚÄں˿ռäºÍÓû§¿Õ¼äÍù·µ¿½±´ ¡£Ëû´Ófdin¿½±´len³¤¶ÈµÄÊý¾Ýµ½fdout £¬¿ÉÊÇÓÐÒ»·½±ØÐèÊǹܵÀ×°±¸ £¬ÕâÒ²ÊÇÏÖÔÚspliceµÄһЩ¾ÖÏÞÐÔ ¡£flags²ÎÊýÓÐÒÔϼ¸ÖÖÈ¡Öµ£º

SPLICEFMOVE £ºÊµÑéÈ¥Òƶ¯Êý¾Ý¶ø²»ÊÇ¿½±´Êý¾Ý ¡£Õâ½ö½öÊǶÔÄں˵ÄÒ»¸öСÌáÐÑ£ºÈôÊÇÄں˲»¿É´ÓpipeÒƶ¯Êý¾Ý»òÕßpipeµÄ»º´æ²»ÊÇÒ»¸öÕûÒ³Ãæ £¬ÈÔÈ»ÐèÒª¿½±´Êý¾Ý ¡£Linux×î³õµÄʵÏÖÓÐЩÎÊÌâ £¬ÒÔÊÇ´Ó2.6.21×îÏÈÕâ¸öÑ¡Ïî²»Æð×÷Óà £¬ºóÃæµÄLinux°æ±¾Ó¦¸Ã»áʵÏÖ ¡£

SPLICEFNONBLOCK £ºsplice ²Ù×÷²»»á±»ÛÕ±Õ ¡£È»¶ø £¬ÈôÊÇÎļþÐÎò·ûûÓб»ÉèÖÃΪ²»¿É±»ÛÕ±Õ·½·¨µÄ I/O £¬ÄÇôŲÓà splice ÓпÉÄÜÈÔÈ»±»ÛÕ±Õ ¡£

SPLICEFMORE£ººóÃæµÄspliceŲÓûáÓиü¶àµÄÊý¾Ý ¡£

spliceŲÓÃʹÓÃÁËLinuxÌá³öµÄ¹ÜµÀ»º³åÇø»úÖÆ £¬ ÒÔÊÇÖÁÉÙÒ»¸öÐÎò·ûҪΪ¹ÜµÀ ¡£

ÒÔÉϼ¸ÖÖÁ㿽±´ÊÖÒÕ¶¼ÊÇïÔÌ­Êý¾ÝÔÚÓû§¿Õ¼äºÍÄں˿ռ俽±´ÊÖÒÕʵÏÖµÄ £¬¿ÉÊÇÓÐЩʱ¼ä £¬Êý¾Ý±ØÐèÔÚÓû§¿Õ¼äºÍÄں˿ռäÖ®¼ä¿½±´ ¡£Õâʱ¼ä £¬ÎÒÃÇÖ»ÄÜÕë¶ÔÊý¾ÝÔÚÓû§¿Õ¼äºÍÄں˿ռ俽±´µÄʱ»úÉÏϹ¦·òÁË ¡£Linuxͨ³£Ê¹ÓÃдʱ¸´ÖÆ(copy on write)À´ïÔ̭ϵͳ¿ªÏú £¬Õâ¸öÊÖÒÕÓÖʱ³£³Æ×÷COW ¡£

ÓÉÓÚƪ·ùÔµ¹ÊÔ­ÓÉ £¬±¾ÎIJ»ÏêϸÏÈÈÝдʱ¸´ÖÆ ¡£»òÐíÐÎòϾÍÊÇ£ºÈôÊǶà¸ö³ÌÐòͬʱ»á¼ûͳһ¿éÊý¾Ý £¬ÄÇôÿ¸ö³ÌÐò¶¼ÓµÓÐÖ¸ÏòÕâ¿éÊý¾ÝµÄÖ¸Õë £¬ÔÚÿ¸ö³ÌÐò¿´À´ £¬×Ô¼º¶¼ÊÇ×ÔÁ¦ÓµÓÐÕâ¿éÊý¾ÝµÄ £¬Ö»Óе±³ÌÐòÐèÒª¶ÔÊý¾ÝÄÚÈݾÙÐÐÐÞ¸Äʱ £¬²Å»á°ÑÊý¾ÝÄÚÈÝ¿½±´µ½³ÌÐò×Ô¼ºµÄÓ¦ÓÿռäÀïÈ¥ £¬Õâʱ¼ä £¬Êý¾Ý²Å³ÉΪ¸Ã³ÌÐòµÄ˽ÓÐÊý¾Ý ¡£ÈôÊdzÌÐò²»ÐèÒª¶ÔÊý¾Ý¾ÙÐÐÐÞ¸Ä £¬ÄÇôÓÀÔ¶¶¼²»ÐèÒª¿½±´Êý¾Ýµ½×Ô¼ºµÄÓ¦ÓÿռäÀï ¡£ÕâÑù¾ÍïÔÌ­ÁËÊý¾ÝµÄ¿½±´ ¡£Ð´Ê±¸´ÖƵÄÄÚÈÝ¿ÉÒÔÔÙдһƪÎÄÕÂÁË ¡£ ¡£ ¡£

³ý´ËÖ®Íâ £¬ÉÐÓÐһЩÁ㿽±´ÊÖÒÕ £¬ºÃ±È¹Å°åµÄLinux I/OÖмÓÉÏO_DIRECT±ê¼Ç¿ÉÒÔÖ±½ÓI/O £¬×èÖ¹ÁË×Ô¶¯»º´æ £¬ÉÐÓÐÉÐδ³ÉÊìµÄfbufsÊÖÒÕ £¬±¾ÎÄÉÐδÁýÕÖËùÓÐÁ㿽±´ÊÖÒÕ £¬Ö»ÊÇÏÈÈݳ£¼ûµÄһЩ £¬ÈôÓÐÐËȤ £¬¿ÉÒÔ×ÔÐÐÑо¿ £¬Ò»Ñùƽ³£³ÉÊìµÄЧÀͶËÏîÄ¿Ò²»á×Ô¼ºË¢ÐÂÄÚºËÖÐÓйØI/OµÄ²¿·Ö £¬Ìá¸ß×Ô¼ºµÄÊý¾Ý´«ÊäËÙÂÊ ¡£

ÒÔÉϾÍÊÇdzÎö Linux ÖеÄÁ㿽±´ÊÖÒÕµÄÏêϸÄÚÈÝ £¬¸ü¶àÇë¹Ø×¢±¾ÍøÄÚÆäËüÏà¹ØÎÄÕ£¡

ÃâÔð˵Ã÷£ºÒÔÉÏչʾÄÚÈÝȪԴÓÚÏàÖúýÌå¡¢ÆóÒµ»ú¹¹¡¢ÍøÓÑÌṩ»òÍøÂçÍøÂçÕûÀí £¬°æȨÕùÒéÓë±¾Õ¾ÎÞ¹Ø £¬ÎÄÕÂÉæ¼°¿´·¨Óë¿´·¨²»´ú±í×ðÁú¿­Ê±¹ÙÍøµÇ¼ÂËÓÍ»úÍø¹Ù·½Ì¬¶È £¬Çë¶ÁÕß½ö×ö²Î¿¼ ¡£±¾ÎĽӴýתÔØ £¬×ªÔØÇë˵Ã÷À´ÓÉ ¡£ÈôÄúÒÔΪ±¾ÎÄÇÖÕ¼ÁËÄúµÄ°æȨÐÅÏ¢ £¬»òÄú·¢Ã÷¸ÃÄÚÈÝÓÐÈκÎÉæ¼°ÓÐÎ¥¹«µÂ¡¢Ã°·¸Ö´·¨µÈÎ¥·¨ÐÅÏ¢ £¬ÇëÄúÁ¬Ã¦ÁªÏµ×ðÁú¿­Ê±¹ÙÍøµÇ¼ʵʱÐÞÕý»òɾ³ý ¡£

Ïà¹ØÐÂÎÅ

ÁªÏµ×ðÁú¿­Ê±¹ÙÍøµÇ¼

18523999891

¿É΢ÐÅÔÚÏß×Éѯ

ÊÂÇéʱ¼ä£ºÖÜÒ»ÖÁÖÜÎå £¬9:30-18:30 £¬½ÚãåÈÕÐÝÏ¢

QR code
ÍøÕ¾µØͼ