51Testing
怬
µçÄÔ°æ

ÓÐÄÄЩºÃÓᢼòµ¥µÄÐÔÄܲâÊÔ¹¤¾ß£¿

2024-1-03 09:33×÷ÕߣºÍæתLinuxÄÚºËÀ´Ô´£ºÖªºõ

¡¡¡¡Ò»¡¢perf¼ò½é
¡¡¡¡´Ó2.6.31Äں˿ªÊ¼£¬LinuxÄÚºË×Ô´øÁËÒ»¸öÐÔÄÜ·ÖÎö¹¤¾ßperf£¬Äܹ»½øÐк¯Êý¼¶ÓëÖ¸ÁµÄÈȵã²éÕÒ¡£Í¨¹ýËü£¬Ó¦ÓóÌÐò¿ÉÒÔÀûÓà PMU£¬tracepoint ºÍÄÚºËÖеÄÌØÊâ¼ÆÊýÆ÷À´½øÐÐÐÔÄÜͳ¼Æ¡£Ëü²»µ«¿ÉÒÔ·ÖÎöÖ¸¶¨Ó¦ÓóÌÐòµÄÐÔÄÜÎÊÌâ (per thread)£¬Ò²¿ÉÒÔÓÃÀ´·ÖÎöÄں˵ÄÐÔÄÜÎÊÌ⣬µ±È»Ò²¿ÉÒÔͬʱ·ÖÎöÓ¦ÓôúÂëºÍÄںˣ¬´Ó¶øÈ«ÃæÀí½âÓ¦ÓóÌÐòÖеÄÐÔÄÜÆ¿¾±¡£
¡¡¡¡PerfÊÇÄÚÖÃÓÚLinuxÄÚºËÔ´ÂëÊ÷ÖеÄÐÔÄÜÆÊÎö(profiling)¹¤¾ß¡£Ëü»ùÓÚʼþ²ÉÑùÔ­Àí£¬ÒÔÐÔÄÜʼþΪ»ù´¡£¬Ö§³ÖÕë¶Ô´¦ÀíÆ÷Ïà¹ØÐÔÄÜÖ¸±êÓë²Ù×÷ϵͳÏà¹ØÐÔÄÜÖ¸±êµÄÐÔÄÜÆÊÎö£¬³£ÓÃÓÚÐÔÄÜÆ¿¾±µÄ²éÕÒÓëÈȵã´úÂëµÄ¶¨Î»¡£
¡¡¡¡1.1°²×°Perf
¡¡¡¡°²×° perf ·Ç³£¼òµ¥, Ö»ÒªÄں˰汾¸ßÓÚ2.6.31µÄ, perfÒѾ­±»ÄÚºËÖ§³Ö. Ê×ÏÈ°²×°ÄÚºËÔ´Âë:
¡¡¡¡apt-get install linux-source
¡¡¡¡ÄÇôÔÚ /usr/src Ŀ¼Ï¾ÍÒѾ­ÏÂÔغÃÁËÄÚºËÔ´Âë, ÎÒÃǶÔÔ´Âë°ü½øÐнâѹ, È»ºó½øÈë tools/perf Ŀ¼ȻºóÇÃÈëÏÂÃæÁ½¸öÃüÁî¼´¿É£º
¡¡¡¡make
¡¡¡¡make install
¡¡¡¡¿ÉÄÜÒòΪϵͳԭÒò, ÐèÒªÌáÇ°°²×°ÏÂÃæµÄ¿ª·¢°ü:
¡¡¡¡apt-get install -y binutils-dev
¡¡¡¡apt-get install -y libdw-dev
¡¡¡¡apt-get install -y python-dev
¡¡¡¡apt-get install -y libnewt-dev
¡¡¡¡1.2PerfµÄ»ù±¾Ê¹ÓÃ
¡¡¡¡CPUÖÜÆÚ(cpu-cycles)ÊÇĬÈϵÄÐÔÄÜʼþ£¬ËùνµÄCPUÖÜÆÚÊÇÖ¸CPUËùÄÜʶ±ðµÄ×îСʱ¼äµ¥Ôª£¬Í¨³£ÎªÒÚ·ÖÖ®¼¸Ã룬ÊÇCPUÖ´ÐÐ×î¼òµ¥µÄÖ¸ÁîʱËùÐèÒªµÄʱ¼ä£¬ÀýÈç¶ÁÈ¡¼Ä´æÆ÷ÖеÄÄÚÈÝ£¬Ò²½Ð×öclock tick¡£
¡¡¡¡perf COMMAND [-e event ...] PROGRAM, perf ÊDzÉÓõÄÕâôһ¸öÃüÁî¸ñʽ, COMMANDÒ»°ã³£ÓõľÍÊÇ top, stat, record, reportµÈ. È»ºóÓà -e ²ÎÊýÀ´Í³¼ÆÐèÒª¹Ø×¢µÄʼþ. ¶à¸öʼþ¾ÍÓöà¸ö -e Á¬½Ó¡£
¡¡¡¡PerfÊÇÒ»¸ö°üº¬22ÖÖ×Ó¹¤¾ßµÄ¹¤¾ß¼¯£¬ÒÔÏÂÊÇ×î³£ÓõÄ5ÖÖ£º
¡¡¡¡¡¤perf-list
¡¡¡¡¡¤ perf-stat
¡¡¡¡¡¤ perf-top
¡¡¡¡¡¤ perf-record
¡¡¡¡¡¤ perf-report
¡¡¡¡¡¤ perf-trace
¡¡¡¡perf-list
¡¡¡¡Perf-listÓÃÀ´²é¿´perfËùÖ§³ÖµÄÐÔÄÜʼþ£¬ÓÐÈí¼þµÄÒ²ÓÐÓ²¼þµÄ¡£
¡¡¡¡List all symbolic event types¡£
¡¡¡¡perf list [hw | sw | cache | tracepoint | event_glob]
¡¡¡¡perf stat
¡¡¡¡ËµÃ÷Ò»¸ö¹¤¾ßµÄ×î¼Ñ;¾¶ÊÇÁоÙÒ»¸öÀý×Ó¡£¿¼²éÏÂÃæÕâ¸öÀý×Ó³ÌÐò¡£ÆäÖк¯Êý longa() ÊǸöºÜ³¤µÄÑ­»·£¬±È½ÏÀË·Ñʱ¼ä¡£º¯Êý foo1 ºÍ foo2 ½«·Ö±ðµ÷Óøú¯Êý 10 ´Î£¬ÒÔ¼° 100 ´Î¡£
¡¡¡¡//t1.c
¡¡¡¡ void longa()
¡¡¡¡ {
¡¡¡¡   int i,j;
¡¡¡¡   for(i = 0; i < 1000000; i++)
¡¡¡¡   j=i; //am I silly or crazy? I feel boring and desperate.
¡¡¡¡ }
¡¡¡¡ void foo2()
¡¡¡¡ {
¡¡¡¡   int i;
¡¡¡¡   for(i=0 ; i < 10; i++)
¡¡¡¡        longa();
¡¡¡¡ }
¡¡¡¡ void foo1()
¡¡¡¡ {
¡¡¡¡   int i;
¡¡¡¡   for(i = 0; i< 100; i++)
¡¡¡¡      longa();
¡¡¡¡ }
¡¡¡¡ int main(void)
¡¡¡¡ {
¡¡¡¡   foo1();
¡¡¡¡   foo2();
¡¡¡¡ }
¡¡¡¡È»ºó±àÒëËü:
¡¡¡¡gcc -o t1 -g t1.c
¡¡¡¡ÏÂÃæÑÝʾÁË perf stat Õë¶Ô³ÌÐò t1 µÄÊä³ö£º
¡¡¡¡root@ubuntu-test:~# perf stat ./t1
¡¡¡¡ Performance counter stats for './t1':
¡¡¡¡        218.584169 task-clock # 0.997 CPUs utilized
¡¡¡¡                18 context-switches # 0.000 M/sec
¡¡¡¡                 0 CPU-migrations # 0.000 M/sec
¡¡¡¡                82 page-faults # 0.000 M/sec
¡¡¡¡       771,180,100 cycles # 3.528 GHz
¡¡¡¡     <not counted> stalled-cycles-frontend
¡¡¡¡     <not counted> stalled-cycles-backend
¡¡¡¡       550,703,114 instructions # 0.71 insns per cycle
¡¡¡¡       110,117,522 branches # 503.776 M/sec
¡¡¡¡             5,009 branch-misses # 0.00% of all branches
¡¡¡¡       0.219155248 seconds time elapsed
¡¡¡¡³ÌÐò t1 ÊÇÒ»¸ö CPU bound ÐÍ£¬ÒòΪ task-clock-msecs ½Ó½ü 1
¡¡¡¡¶Ô t1 ½øÐе÷ÓÅÓ¦¸ÃÒªÕÒµ½Èȵã ( ¼´×îºÄʱµÄ´úÂëƬ¶Î )£¬ÔÙ¿´¿´ÊÇ·ñÄܹ»Ìá¸ßÈȵã´úÂëµÄЧÂÊ¡£È±Ê¡Çé¿öÏ£¬³ýÁË task-clock-msecs Ö®Í⣬perf stat »¹¸ø³öÁËÆäËû¼¸¸ö×î³£ÓõÄͳ¼ÆÐÅÏ¢£º
¡¡¡¡¡¤Task-clock-msecs£ºCPU ÀûÓÃÂÊ£¬¸ÃÖµ¸ß£¬ËµÃ÷³ÌÐòµÄ¶àÊýʱ¼ä»¨·ÑÔÚ CPU ¼ÆËãÉ϶ø·Ç IO¡£
¡¡¡¡¡¤ Context-switches£º½ø³ÌÇл»´ÎÊý£¬¼Ç¼Á˳ÌÐòÔËÐйý³ÌÖз¢ÉúÁ˶àÉٴνø³ÌÇл»£¬Æµ·±µÄ½ø³ÌÇл»ÊÇÓ¦¸Ã±ÜÃâµÄ¡£
¡¡¡¡¡¤ Cache-misses£º³ÌÐòÔËÐйý³ÌÖÐ×ÜÌåµÄ cache ÀûÓÃÇé¿ö£¬Èç¹û¸ÃÖµ¹ý¸ß£¬ËµÃ÷³ÌÐòµÄ cache ÀûÓò»ºÃ
¡¡¡¡¡¤ CPU-migrations£º±íʾ½ø³Ì t1 ÔËÐйý³ÌÖз¢ÉúÁ˶àÉÙ´Î CPU ǨÒÆ£¬¼´±»µ÷¶ÈÆ÷´ÓÒ»¸ö CPU תÒƵ½ÁíÍâÒ»¸ö CPU ÉÏÔËÐС£
¡¡¡¡¡¤ Cycles£º´¦ÀíÆ÷ʱÖÓ£¬Ò»Ìõ»úÆ÷Ö¸Áî¿ÉÄÜÐèÒª¶à¸ö cycles£¬Instructions: »úÆ÷Ö¸ÁîÊýÄ¿¡£
¡¡¡¡¡¤ IPC£ºÊÇ Instructions/Cycles µÄ±ÈÖµ£¬¸ÃÖµÔ½´óÔ½ºÃ£¬ËµÃ÷³ÌÐò³ä·ÖÀûÓÃÁË´¦ÀíÆ÷µÄÌØÐÔ¡£
¡¡¡¡¡¤ Cache-references: cache ÃüÖеĴÎÊý£¬Cache-misses: cache ʧЧµÄ´ÎÊý¡£
¡¡¡¡Í¨¹ýÖ¸¶¨ -e Ñ¡ÏÄú¿ÉÒԸıä perf stat µÄȱʡʼþ ( ¹ØÓÚʼþ£¬ÔÚÉÏһС½ÚÒѾ­ËµÃ÷£¬¿ÉÒÔͨ¹ý perf list À´²é¿´ )¡£¼ÙÈçÄúÒѾ­ÓкܶàµÄµ÷Óž­Ñ飬¿ÉÄÜ»áʹÓà -e Ñ¡ÏîÀ´²é¿´ÄúËù¸ÐÐËȤµÄÌØÊâµÄʼþ¡£
¡¡¡¡ÓÐЩ³ÌÐòÂýÊÇÒòΪ¼ÆËãÁ¿Ì«´ó£¬Æä¶àÊýʱ¼ä¶¼Ó¦¸ÃÔÚʹÓà CPU ½øÐмÆË㣬Õâ½Ð×ö CPU bound ÐÍ£»ÓÐЩ³ÌÐòÂýÊÇÒòΪ¹ý¶àµÄ IO£¬ÕâÖÖʱºòÆä CPU ÀûÓÃÂÊÓ¦¸Ã²»¸ß£¬Õâ½Ð×ö IO bound ÐÍ£»¶ÔÓÚ CPU bound ³ÌÐòµÄµ÷ÓÅºÍ IO bound µÄµ÷ÓÅÊDz»Í¬µÄ¡£
¡¡¡¡perf top
¡¡¡¡Ê¹Óà perf stat µÄʱºò£¬ÍùÍùÄúÒѾ­ÓÐÒ»¸öµ÷ÓŵÄÄ¿±ê¡£±ÈÈçÎÒ¸Õ²ÅдµÄÄǸöÎÞÁijÌÐò t1¡£
¡¡¡¡Ò²ÓÐЩʱºò£¬ÄúÖ»ÊÇ·¢ÏÖϵͳÐÔÄÜÎÞ¶ËϽµ£¬²¢²»Çå³þ¾¿¾¹Äĸö½ø³Ì³ÉΪÁËÌ°³ÔµÄ hog¡£
¡¡¡¡´ËʱÐèÒªÒ»¸öÀàËÆ top µÄÃüÁÁгöËùÓÐÖµµÃ»³ÒɵĽø³Ì£¬´ÓÖÐÕÒµ½ÐèÒª½øÒ»²½Éó²éµÄ¼Ò»ï¡£
¡¡¡¡Perf top ÓÃÓÚʵʱÏÔʾµ±Ç°ÏµÍ³µÄÐÔÄÜͳ¼ÆÐÅÏ¢¡£¸ÃÃüÁîÖ÷ÒªÓÃÀ´¹Û²ìÕû¸öϵͳµ±Ç°µÄ״̬£¬±ÈÈç¿ÉÒÔͨ¹ý²é¿´¸ÃÃüÁîµÄÊä³öÀ´²é¿´µ±Ç°ÏµÍ³×îºÄʱµÄÄں˺¯Êý»òij¸öÓû§½ø³Ì¡£
¡¡¡¡ÈÃÎÒÃÇÔÙÉè¼ÆÒ»¸öÀý×ÓÀ´ÑÝʾ°É£¬ÎҺܿì¾ÍÏëµ½ÁËÈç´úÂëÇåµ¥ 2 ËùʾµÄÒ»¸ö³ÌÐò£º
¡¡¡¡//t2.c
¡¡¡¡main(){
¡¡¡¡    int i;
¡¡¡¡    while(1) i++;
¡¡¡¡}
¡¡¡¡È»ºó±àÒëÕâ¸ö³ÌÐò£º
¡¡¡¡gcc -o t2 -g t2.c
¡¡¡¡ÔËÐÐÕâ¸ö³ÌÐòºó£¬ ÎÒÃÇÁíÆðÒ»¸ö´°¿Ú£¬ÔËÐÐperf topÀ´¿´¿´£º
¡¡¡¡Events: 8K cycles
¡¡¡¡ 98.67% t2 [.] main
¡¡¡¡  1.10% [kernel] [k] __do_softirq
¡¡¡¡  0.07% [kernel] [k] _raw_spin_unlock_irqrestore
¡¡¡¡  0.05% perf [.] kallsyms__parse
¡¡¡¡  0.05% libc-2.15.so [.] 0x807c7
¡¡¡¡  0.05% [kernel] [k] kallsyms_expand_symbol
¡¡¡¡  0.02% perf [.] map__process_kallsym_symbol
¡¡¡¡ºÜÈÝÒױ㷢ÏÖ t2 ÊÇÐèÒª¹Ø×¢µÄ¿ÉÒɳÌÐò¡£²»¹ýÆä×÷°¸ÊÖ·¨Ì«¼òµ¥£ºËÁÎ޼ɵ¬µØÀË·Ñ×Å CPU¡£ËùÒÔÎÒÃDz»ÓÃÔÙ×öʲôÆäËûµÄÊÂÇé±ã¿ÉÒÔÕÒµ½ÎÊÌâËùÔÚ¡£µ«ÏÖʵÉú»îÖУ¬Ó°ÏìÐÔÄܵijÌÐòÒ»°ã¶¼²»»áÈç´ËÓÞ´À£¬ËùÒÔÎÒÃÇÍùÍù»¹ÐèҪʹÓÃÆäËûµÄ perf ¹¤¾ß½øÒ»²½·ÖÎö¡£
¡¡¡¡Ê¹Óà perf record, ½â¶Á report
¡¡¡¡Ê¹Óà top ºÍ stat Ö®ºó£¬Äú¿ÉÄÜÒѾ­´óÖÂÓÐÊýÁË¡£Òª½øÒ»²½·ÖÎö£¬±ãÐèҪһЩÁ£¶È¸üϸµÄÐÅÏ¢¡£±ÈÈç˵ÄúÒѾ­¶Ï¶¨Ä¿±ê³ÌÐò¼ÆËãÁ¿½Ï´ó£¬Ò²ÐíÊÇÒòΪÓÐЩ´úÂëдµÄ²»¹»¾«¼ò¡£ÄÇôÃæ¶Ô³¤³¤µÄ´úÂëÎļþ£¬¾¿¾¹Äļ¸ÐдúÂëÐèÒª½øÒ»²½ÐÞ¸ÄÄØ£¿Õâ±ãÐèҪʹÓà perf record ¼Ç¼µ¥¸öº¯Êý¼¶±ðµÄͳ¼ÆÐÅÏ¢£¬²¢Ê¹Óà perf report À´ÏÔʾͳ¼Æ½á¹û¡£
¡¡¡¡ÄúµÄµ÷ÓÅÓ¦¸Ã½«×¢ÒâÁ¦¼¯Öе½°Ù·Ö±È¸ßµÄÈȵã´úÂëƬ¶ÎÉÏ£¬¼ÙÈçÒ»¶Î´úÂëÖ»Õ¼ÓÃÕû¸ö³ÌÐòÔËÐÐʱ¼äµÄ 0.1%£¬¼´Ê¹Äú½«ÆäÓÅ»¯µ½½öÊ£Ò»Ìõ»úÆ÷Ö¸Á¿ÖÅÂÒ²Ö»Äܽ«ÕûÌåµÄ³ÌÐòÐÔÄÜÌá¸ß 0.1%¡£Ë×»°Ëµ£¬ºÃ¸ÖÓÃÔÚµ¶ÈÐÉÏ£¬²»±ØÎÒ¶à˵ÁË¡£
¡¡¡¡perf record -e cpu-clock ./t1
¡¡¡¡perf report
¡¡¡¡perf report Êä³ö½á¹û£º
¡¡¡¡Events: 229 cpu-clock
¡¡¡¡100.00% t1 t1 [.] longa
¡¡¡¡²»³öËùÁÏ£¬hot spot ÊÇ longa( ) º¯Êý¡£µ«£¬´úÂëÊǷdz£¸´ÔÓÄÑ˵µÄ£¬t1 ³ÌÐòÖÐµÄ foo1() Ò²ÊÇÒ»¸öDZÔڵĵ÷ÓŶÔÏó£¬ÎªÊ²Ã´Òªµ÷Óà 100 ´ÎÄǸöÎÞÁÄµÄ longa() º¯ÊýÄØ£¿µ«ÎÒÃÇÔÚÉÏͼÖÐÎÞ·¨·¢ÏÖ foo1 ºÍ foo2£¬¸üÎÞ·¨Á˽âËûÃǵÄÇø±ðÁË¡£
¡¡¡¡ÎÒÔø·¢ÏÖ×Ô¼ºÐ´µÄÒ»¸ö³ÌÐò¾ÓÈ»ÓнüÒ»°ëµÄʱ¼ä»¨·ÑÔÚ string ÀàµÄ¼¸¸ö·½·¨ÉÏ£¬string ÊÇ C++ ±ê×¼£¬ÎÒ¾ø²»¿ÉÄÜд³ö±È STL ¸üºÃµÄ´úÂëÁË¡£Òò´ËÎÒÖ»ÓÐÕÒµ½×Ô¼º³ÌÐòÖйý¶àʹÓà string µÄµØ·½¡£Òò´ËÎÒºÜÐèÒª°´ÕÕµ÷ÓùØϵ½øÐÐÏÔʾµÄͳ¼ÆÐÅÏ¢¡£
¡¡¡¡Ê¹Óà perf µÄ -g Ñ¡Ïî±ã¿ÉÒԵõ½ÐèÒªµÄÐÅÏ¢£º
¡¡¡¡perf record -e cpu-clock -g ./t1
¡¡¡¡perf report
¡¡¡¡Êä³ö½á¹û£º
¡¡¡¡Events: 270 cpu-clock
¡¡¡¡- 100.00% t1 t1 [.] longa
¡¡¡¡   - longa
¡¡¡¡      + 91.85% foo1
¡¡¡¡      + 8.15% foo2
¡¡¡¡Í¨¹ý¶Ô calling graph µÄ·ÖÎö£¬Äܷܺ½±ãµØ¿´µ½ 91.85% µÄʱ¼ä¶¼»¨·ÑÔÚ foo1() º¯ÊýÖУ¬ÒòΪËüµ÷ÓÃÁË 100 ´Î longa() º¯Êý£¬Òò´Ë¼ÙÈç longa() ÊǸöÎÞ·¨ÓÅ»¯µÄº¯Êý£¬ÄÇô³ÌÐòÔ±¾ÍÓ¦¸Ã¿¼ÂÇÓÅ»¯ foo1£¬¼õÉÙ¶Ô longa() µÄµ÷ÓôÎÊý¡£
¡¡¡¡Ê¹Óà tracepoint
¡¡¡¡µ± perf ¸ù¾Ý tick ʱ¼äµã½øÐвÉÑùºó£¬ÈËÃDZãÄܹ»µÃµ½Äں˴úÂëÖÐµÄ hot spot¡£ÄÇʲôʱºòÐèҪʹÓà tracepoint À´²ÉÑùÄØ£¿
¡¡¡¡ÎÒÏëÈËÃÇʹÓà tracepoint µÄ»ù±¾ÐèÇóÊǶÔÄں˵ÄÔËÐÐʱÐÐΪµÄ¹ØÐÄ£¬ÈçÇ°ËùÊö£¬ÓÐЩÄں˿ª·¢ÈËÔ±ÐèҪרעÓÚÌض¨µÄ×Óϵͳ£¬±ÈÈçÄÚ´æ¹ÜÀíÄ£¿é¡£Õâ±ãÐèҪͳ¼ÆÏà¹ØÄں˺¯ÊýµÄÔËÐÐÇé¿ö¡£ÁíÍ⣬ÄÚºËÐÐΪ¶ÔÓ¦ÓóÌÐòÐÔÄܵÄÓ°ÏìÒ²ÊDz»ÈݺöÊӵģº
¡¡¡¡ÒÔ֮ǰµÄÒź¶ÎªÀý£¬¼ÙÈçʱ¹âµ¹Á÷£¬ÎÒÏëÎÒÒª×öµÄÊÇͳ¼Æ¸ÃÓ¦ÓóÌÐòÔËÐÐÆڼ便¾¹·¢ÉúÁ˶àÉÙ´Îϵͳµ÷Óá£ÔÚÄÄÀï·¢ÉúµÄ£¿
¡¡¡¡ÏÂÃæÎÒÓà ls ÃüÁîÀ´ÑÝʾ sys_enter Õâ¸ö tracepoint µÄʹÓãº
¡¡¡¡root@ubuntu-test:~# perf stat -e raw_syscalls:sys_enter ls
¡¡¡¡bin libexec off perf.data.old t1 t3 tutong.iso
¡¡¡¡bwtest minicom.log perf.data pktgen t1.c t3.c
¡¡¡¡ Performance counter stats for 'ls':
¡¡¡¡               111 raw_syscalls:sys_enter
¡¡¡¡       0.001557549 seconds time elapsed
¡¡¡¡¸ö±¨¸æÏêϸ˵Ã÷ÁËÔÚ ls ÔËÐÐÆڼ䷢ÉúÁ˶àÉÙ´Îϵͳµ÷Óà ( ÉÏÀýÖÐÓÐ 111 ´Î )¡£
¡¡¡¡±¾ÎÄÄÚÈݲ»ÓÃÓÚÉÌҵĿµÄ£¬ÈçÉ漰֪ʶ²úȨÎÊÌ⣬ÇëȨÀûÈËÁªÏµ51TestingС±à(021-64471599-8017)£¬ÎÒÃǽ«Á¢¼´´¦Àí
ÐÔÄܲâÊÔ¹¤¾ß
µ±Ç°Ã»ÓÐÆÀÂÛµã»÷·¢±íÆÀÂÛ

Ïà¹ØÔĶÁ