第15åããã©ã¼ã«ãã¤ã³ã¸ã§ã¯ã·ã§ã³ãã¹ã¹ã¡ã
Tweet
ååç´¹ä»ãã SystemTap ã¯ãã·ã¹ãã ã®ç®¡çãä¿å®ãè¡ã人ã«ã¨ã£ã¦ã ãã§ãªããLinux ã«ã¼ãã«ã®éçºãã·ã¹ãã ã®éçºãè¡ã人ã«ã¨ã£ã¦ãæç¨ãªãã¼ã«ã§ãã SystemTap ã使ãã¨ãä»»æã®ç®æã«é 延ãæ¿å ¥ããããã¡ã¢ãªã¼ã®å 容ãæ¸ãæããããããã¨ãã§ãã¾ãããã®ãããæå³çã«ç«¶åç¶æ ãçºçããããã¨ã§åé¡äºè±¡ãåç¾ãããããæå³çã«ã¨ã©ã¼ç¶æ ãçºçããããã¨ã§ãã©ãã«ãçããªããã©ããã試é¨ããããããã¨ãã§ãã¾ããããã§ãä»å㯠SystemTap ãç¨ãã¦è©¦é¨ãè¡ã£ãäºä¾ã«ã¤ãã¦ç´¹ä»ãããã¨æãã¾ãã
ããã§ç´¹ä»ãã¦ããå 容ã¯ããã©ãã«çºçæã®å¯¾å¦ããã¼ã確èªãããå ´åã«è©¦ããã¨ãã§ãã¾ããä¾ãã°ãããªã¼ãºäºè±¡ãçºçããå ´åã«ã¯ã SysRq ãã¼ã使ã£ã¦æ å ±ãåå¾ããç·´ç¿ãã§ãã¾ãã
ã¾ãã KernelOops ã¤ãã³ããçºçããå ´åã«åãã¦ã /proc/sys/kernel/panic_on_oops ã« 1 ãè¨å®ã㦠kdump ãµã¼ãã¹ãéå§ãã¦ãããã¨ã«ããã kdump ãåå¾ãã¦åé¡ã解æããç·´ç¿ãã§ãã¾ããä»ã¾ã§ã®é£è¼ã§ç´¹ä»ãããããã¯ãæ´»ç¨ããªããææ¦ãã¦ã¿ã¦ãã ããã
使ãæ¹1ï¼ä¸æ´åç¶æ ãæ¤ç¥ãããçºçããããããã
RHEL 6 ã«ããã¦åå ä¸æã®ã«ã¼ãã«ãããã¯ãçºçããã¨ããäºä¾å ±åã Red Hat 社ã®ãµã¤ãã«ããã¾ãããï¼ https://access.redhat.com/solutions/640843 ï¼ãã®åé¡ã«æ©ã¾ããã¦ããã客ãã¾ããã®ç¸è«ãåããã«ã¼ãã«ã®ã½ã¼ã¹ã³ã¼ãã調æ»ãã¦ã¿ãã®ã§ãããä¸å¯©ãªç¹ã¯è¦ã¤ããã¾ããã§ããã
ããã§ãçç¾ãçºçãããããã«ã«ã¼ãã«ã¡ãã»ã¼ã¸ãåºåããããã«ã以ä¸ã®ããã« SystemTap ã¹ã¯ãªãããã客ãã¾ã®ã·ã¹ãã ã«ä»æããç¶æ
ã§è©¦é¨ããã¦ããã ãã¾ããã
---------- ã³ãã³ãã©ã¤ã³ããããã ---------- # stap -g -e 'probe kernel.function("start_thread").return { %{ WARN(tsk_used_math(current) && !((struct fpu *) ¤t->thread.xstate)->state, "tsk_used_math(current) != 0") %}; ---------- ã³ãã³ãã©ã¤ã³ãããã¾ã§ ----------
çç¾ãçºçããªãéãããã®ã¹ã¯ãªãããã¡ãã»ã¼ã¸ãåºåãããã¨ã¯ããã¾ããã
ããããé©ãããã¨ã«ãã«ã¼ãã«ãããã¯ãçºçããåã«ããã®ã¹ã¯ãªããã«ããã¡ãã»ã¼ã¸ãåºåããã¦ãã¾ãããã¤ã¾ãããã®ã¹ã¯ãªããã«ãããçç¾ãçºçãã¦ãããã¨ã¨ããã®çºçã¿ã¤ãã³ã°ã execve() ã·ã¹ãã ã³ã¼ã«ã®å®è¡ä¸ã§ãããã¨ãå¤æãã訳ã§ãã
ããããã«ã¼ãã«ã®ã½ã¼ã¹ã³ã¼ããå調æ»ãããã®ã®ãçç¾ãçºçããä½å°ã¯è¦å½ããã¾ããã§ããã
ããã§ãããæ£ç¢ºãªçºçç®æãå²ãåºãããã«ã以ä¸ã®ããã«å¥ã® SystemTap ã¹ã¯ãªãããä»æããç¶æ
ã§ãå度試é¨ãè¡ã£ã¦ããã ãã¾ãããï¼ãã®ã¹ã¯ãªããã¯æ¿å
¥ä½ç½®ãã¢ãã¬ã¹ã§æå®ãã¦ããã®ã§ãRHEL 6 ã® 2.6.32-358.23.2.el6.x86_64 ã«ã¼ãã«ä»¥å¤ã§ã¯åãã¾ãããä»»æã®ç®æã«ããã¯ãä»æããä¾ã¨ãã¦èãã¦ãã ãããï¼
---------- ã«ã¼ãã« 2.6.32-358.23.2.el6.x86_64 ç¨ã®ã³ãã³ãã©ã¤ã³ããããã ---------- # stap -g -e ' function check_status() %{ WARN(used_math(), "used_math() is set with current->thread.xstate=%p\n", current->thread.xstate); WARN(sigismember(¤t->pending.signal, SIGSEGV), "SIGSEGV is pending\n"); %} probe kprobe.statement(0xffffffff811d9744).absolute /* fs/binfmt_elf.c:735 */ { check_status(); } probe kprobe.statement(0xffffffff811d9856).absolute /* fs/binfmt_elf.c:761 */ { check_status(); } probe kprobe.statement(0xffffffff811da7a1).absolute /* fs/binfmt_elf.c:790 */ { check_status(); } probe kprobe.statement(0xffffffff811d997f).absolute /* fs/binfmt_elf.c:825 */ { check_status(); } probe kprobe.statement(0xffffffff811d99eb).absolute /* fs/binfmt_elf.c:855 */ { check_status(); } probe kprobe.statement(0xffffffff811d9bc3).absolute /* fs/binfmt_elf.c:877 */ { check_status(); } probe kprobe.statement(0xffffffff811d9c04).absolute /* fs/binfmt_elf.c:895 */ { check_status(); } probe kprobe.statement(0xffffffff811d9e48).absolute /* fs/binfmt_elf.c:916 */ { check_status(); } probe kprobe.statement(0xffffffff811da7c1).absolute /* fs/binfmt_elf.c:929 */ { check_status(); } probe kprobe.statement(0xffffffff811dd3aa).absolute /* fs/binfmt_elf.c:948 */ { check_status(); } probe kprobe.statement(0xffffffff811dd41f).absolute /* fs/binfmt_elf.c:953 */ { check_status(); } probe kprobe.statement(0xffffffff811dddd3).absolute /* fs/binfmt_elf.c:957 */ { check_status(); } probe kprobe.statement(0xffffffff811dde53).absolute /* fs/binfmt_elf.c:966 */ { check_status(); } probe kprobe.statement(0xffffffff811dde72).absolute /* fs/binfmt_elf.c:969 */ { check_status(); } probe kprobe.statement(0xffffffff811ddea8).absolute /* fs/binfmt_elf.c:977 */ { check_status(); } probe kprobe.statement(0xffffffff811ddeb8).absolute /* fs/binfmt_elf.c:991 */ { check_status(); } probe kprobe.statement(0xffffffff811d9581).absolute /* fs/binfmt_elf.c:1009 */ { check_status(); } probe kernel.function("start_thread") { check_status(); } probe kernel.function("start_thread").return { check_status(); } function check_signal(sig:long, task:long) %{ WARN(current->in_execve, "force_sig_info() is called with signal=%u pid=%u\n", (unsigned int) STAP_ARG_sig, ((struct task_struct *) STAP_ARG_task)->pid); %} probe kernel.function("force_sig_info") { check_signal($sig, $t); } probe kernel.function("fpu_init") { %{ WARN(current->in_execve, "fpu_init() is called with used_math()=%u current->thread.xstate=%p\n", used_math(), current->thread.xstate) %}; }' ---------- ã«ã¼ãã« 2.6.32-358.23.2.el6.x86_64 ç¨ã®ã³ãã³ãã©ã¤ã³ãããã¾ã§ ----------
ãã®ã¹ã¯ãªããã«ãããæ¬æ¥ã¯ flush_thread() é¢æ°å ã§ã¯ãªã¢ããã¦ããã¯ãã® PF_USED_MATH ãã©ã°ãã¯ãªã¢ããã¦ããªããã¨ãå¤æãã¾ãããããã§ããã©ã°ãæä½ãããç®æãæ´ãåºãã¦ã¿ãã¨ãããã客ãã¾ã®ã·ã¹ãã ã§ä½¿ç¨ãã¦ãã cpuset cgroup æ©è½ã®ä¸ã«ãã¹ã¬ããã»ã¼ãã§ã¯ãªãå¦çãããã¾ãããããã§ã競åç¶æ ãã¨ãã¥ã¬ã¼ã·ã§ã³ããããã«ã以ä¸ã®ããã« SystemTap ã¹ã¯ãªãããä»æããç¶æ ã§æå ã®ç°å¢ã§å®é¨ããã¨ãããäºè±¡ãåç¾ããããã¨ã«æåãã¾ããã
---------- ã³ãã³ãã©ã¤ã³ããããã ---------- # stap -F -g -e 'probe kernel.function("flush_thread").return { if (execname() == "su") { %{ current->flags |= PF_USED_MATH %}; exit(); } }' # ulimit -c unlimited; su -c "echo hello" ---------- ã³ãã³ãã©ã¤ã³ãããã¾ã§ ----------
ãã®ä¸å
·å㯠Linux 2.6.31 ã§æ··å
¥ãã Linux 3.17 ã§ä¿®æ£ããã 2.6.32-504.8.1.el6 ããã³ 3.10.0-210.el7 ã«ãä¿®æ£ãããã¯ãã¼ãããã¾ããã
ï¼ https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=2ad654bc5e2b211e92f66da1d819e47d79a866f0 ï¼
ä¸æ´åç¶æ
ã®çºçæ¡ä»¶ãå½ä»¤ã®å®è¡ã¿ã¤ãã³ã°ã«å¼·ãä¾åãã¦ãããã¨ã¨ãä¸æ´åç¶æ
ãçºçãã¦ããã·ã°ãã«ãåä¿¡ããã¾ã§ã®å¦çã®æµãã kdump ã®æ
å ±ãã追ããã¨ãã§ããªãã±ã¼ã¹ã¨ããç¹æ®ããçµã¿åããã£ã¦ãä¸æçãªã«ã¼ãã«ãããã¯ãå¼ãèµ·ããã¦ãã¾ãããã客ãã¾ãäºè±¡ã®åç¾æé ã確ç«ãã SystemTap ã«ãã調æ»ã容èªãã¦ããã ããããããããã®ä¸å
·åãè¦ã¤ãããã¨ãã§ãã¾ãããï¼åç¾æé ã確ç«ãããã¨ã®éè¦æ§ã¯ã Bugzilla ãã¹ã¹ã¡ ã§ç´¹ä»ããéãã§ããï¼
使ãæ¹2ï¼ã¡ã¢ãªã¼å²ãå½ã¦è¦æ±ã失æãããã
Linux ã·ã¹ãã ã§ã¯ã OOM killer ã®çºçæã«ãããããã¯ãçºçãã¦ãã·ã¹ãã ã®å¿çãç¡ããªã£ãã¾ã¾ã«ãªã£ã¦ãã¾ãã¨ããäºè±¡ãçºçãã¾ããããã¦ãäºæãã¬åèµ·åããã³ã°ã¢ããã®åå ããæ³å®å¤ã®è² è·ãããã£ã¦ã¡ã¢ãªã¼æ¯æ¸ç¶æ ã«é¥ãã OOM killer çºçæã®ãããããã¯ã«ããããã»ã¹ãåããªããªã£ã¦ããããã¨ããç¾å®ã®ãã©ãã«äºä¾ãæ£è¦ããã¾ãããã®äºè±¡ãçºçããçç±ãæ¨å¹´æ«ã«æããã«ãªã£ãï¼ http://lwn.net/Articles/627419/ ï¼ã®ã§ããã Linux ã«ã¼ãã«éçºè ã¯ãã®äºè±¡ãã©ããã£ã¦ä¿®æ£ãã¹ããªã®ãã§æ©ãã§ããæä¸ã§ããã¨ããã®ãã
- ã«ã¼ãã«ã®ã¡ã¢ãªã¼ç®¡çãµãã·ã¹ãã ã¯ãã¡ã¢ãªã¼å²ãå½ã¦ãå¾ ã¤ãã¨ãå¯è½ãªç¶æ³ã㤠__GFP_NORETRY ãæå®ããã¦ããªã32ãããã¤ã以ä¸ã®ã¡ã¢ãªã¼å²ãå½ã¦è¦æ±ã§ããã°ã OOM killer ã«ããé¸æãããªãéãã空ãã¡ã¢ãªã¼ã確ä¿ã§ããããã«ãªãã¾ã§æ°¸é ã«å¾ ã¡ç¶ããã
- ã«ã¼ãã«ã®ã¡ã¢ãªã¼ç®¡çãµãã·ã¹ãã ãå©ç¨ããå´ã¯ 1. ã®æåãæ³å®ãã¦ããªããè¨ãæããã¨ã空ãã¡ã¢ãªã¼ã確ä¿ã§ããããã«ãªãã¾ã§æ°¸é ã«å¾ ã¡ç¶ããã®ã§ã¯ãªãã¡ã¢ãªã¼å²ãå½ã¦è¦æ±ã失æãããã¨ãåæã¨ãã¦ããã¯ã®ç²å¾å¦çãè¡ã£ã¦ããã
- OOM killer ã«ããé¸æãããã¹ã¬ãããéããã«çµäºã§ããããã«ããããã«ã OOM killer ãé¸æããã¹ã¬ããã¯é常æã®ããã«äºç´ãã¦ããã¡ã¢ãªã¼ããå²ãå½ã¦ãè¡ããã¨ããé æ ®ãããã¦ããããã®ãããã«ã¼ãã«ã®ã¡ã¢ãªã¼ç®¡çãµãã·ã¹ãã ãå©ç¨ããå´ã 1. 㧠OOM killer ã«é¸æãããã¨ãã¦ããå®éã«ã¡ã¢ãªã¼å²ãå½ã¦è¦æ±ã失æãããã¨ã¯æ» å¤ã«ãªãã
- é常æã®ããã«äºç´ãã¦ããã¡ã¢ãªã¼ã 3. ã®é æ ®ã«ããæ¯æ¸ããªãããã«ãã«ã¼ãã«ã®ã¡ã¢ãªã¼ç®¡çãµãã·ã¹ãã ã¯ã OOM killer ãé¸æããã¹ã¬ãããçµäºããã¾ã§ã¯å¥ã®ã¹ã¬ãããé¸æããªãããã®ããã OOM killer ãé¸æããã¹ã¬ãããããã¯ã®ç²å¾å¾ ã¡ãªã©ã«ããçµäºã§ããªãã£ãå ´åã誰ããã¡ã¢ãªã¼ãèªçºçã«è§£æ¾ããªãéããæ°¸é ã«ç©ºãã¡ã¢ãªã¼ã確ä¿ã§ããªããããããã¯ç¶æ ãçºçããã
- ã«ã¼ãã«ã®ã¡ã¢ãªã¼ç®¡çãµãã·ã¹ãã ãå©ç¨ããå´ã«ã¯ã¡ã¢ãªã¼å²ãå½ã¦ã失æããå ´åã«å®è¡ãããã¨ã©ã¼ãã³ããªã³ã°å¦çãç¨æããã¦ãããã 1. ããã³ 3. ã«ããå²ãå½ã¦è¦æ±ã失æãã¦ããªãã£ãããã«ãã¨ã©ã¼ãã³ããªã³ã°å¦çã®å¤§é¨åã¯ä¸åº¦ããã¹ãããã¦ããªããããã¦ã 2. ããã³ 4. ã«ãããããããã¯ç¶æ ãçºçããã®ã ãããããããã¯ãçºçãããã¨ã誰ãæ¤ç¥ã§ããªããã対å¦ã§ããªãã
- ã¨ã©ã¼ãã³ããªã³ã°å¦çããã¹ãããããã«ãã¡ã¢ãªã¼å²ãå½ã¦ãã©ã³ãã ã«å¤±æããããã©ã¼ã«ãã¤ã³ã¸ã§ã¯ã·ã§ã³æ©è½ãããããå ¨ã¦ã®ã¨ã©ã¼ãã³ããªã³ã°å¦çããã¹ããããããã«æå³ããã¿ã¤ãã³ã°ã§å¤±æããããã¨ãé£ããã
ã¨ãããããããç¶æ³ã«ããããã§ãã 1. ã®æåãå¤æ´ãã¦æ°¸é ã«å¾ ããªãããã«ããã° 5. ã®ã¨ã©ã¼ãã³ããªã³ã°å¦çã使ãããããã«ãªããä¸æçãªä¸å ·åãå¤çºãããã¨ãäºæ³ããã¦ãã¾ããããã§ã 1. ã®æåãå¤æ´ããã¨ã©ã®ãããªä¸å ·åãèµ·ããã®ããå®é¨ããããã«ã以ä¸ã®ããã« kmalloc() é¢æ°ã«ããå ¨ã¦ã®ã¡ã¢ãªã¼å²ãå½ã¦è¦æ±ã1åãã¤å¤±æããç¶æ³ã SystemTap ã使ããã¨ã§åç¾ãã¦ã¿ããã¨æãã¾ããï¼ https://lkml.org/lkml/2014/12/25/64 ï¼
---------- fault_injection.stpããããã ---------- global traces_bt[65536]; probe begin { printf("Probe start!\n"); } probe kernel.function("__kmalloc") { if (($flags & %{ __GFP_NOFAIL | __GFP_WAIT %} ) == %{ __GFP_WAIT %} && execname() != "stapio") { bt = backtrace(); if (traces_bt[bt]++ == 0) { print_stack(bt); printf("\n\n"); $size = 1 < 30;="" }="" }="" }="" probe="" end="" {="" delete="" traces_bt;="" }="" ----------="" fault_injection.stpãããã¾ã§="" ----------="" />
---------- ã³ãã³ãã©ã¤ã³ããããã ---------- # stap -p4 -g -DSTP_NO_OVERLOAD -m stap_fault_injection fault_injection.stp # staprun stap_fault_injection.ko ---------- ã³ãã³ãã©ã¤ã³ãããã¾ã§ ----------
å®éã«ãã®è©¦é¨ãè¡ãã¨ãåæåéä¸ã®ãã¼ã¿æ§é ä½ã解æ¾ãããã¨ãã¦ããªã¼ãºãçºç ï¼ https://lkml.org/lkml/2015/1/9/281 ï¼ããããã¡ã¢ãªã¼ç ´å£ã«ããã«ã¼ãã«ãããã¯ãçºçï¼ http://lists.freedesktop.org/archives/dri-devel/2015-January/075922.html ï¼ãããã¨ãã»ã¼ééããªããã©ãã«ã«å·»ãè¾¼ã¾ãããã¨ã§ãããã
ä»ã«ã kmem_cache_alloc() ã vmalloc() ã __get_free_pages() ãªã©ã®ã¡ã¢ãªã¼å²ãå½ã¦é¢æ°ãåå¨ãã¦ãããå ¨ã¦ã®ã±ã¼ã¹ããã¹ããã¦ä¸å ·åã解æ¶ããã®ã¯éç¾å®çã§ããã¨èãããããããå¥ã®ã¢ããã¼ããæ¤è¨ããå¿ è¦ãããããã§ãã
ï¼åç°å²å¤«ï¼
ã³ã¼ãã¼ãã¬ã¼ã¯ããªãã¨ãªã³ã
åã åã®ã³ã©ã ã§ç´¹ä»ãã HP200LX ã§ãããé·å¹´æ¾ã£ã¦ãããéã«åé¡ãçºçããããã§ãé常ã§ããã°æ°é±éæã¤ã¯ãã®é»æ± ãæ°æéã§æ¶èãã¦ãã¾ãã¾ããæ®å¿µã§ããå©ç¨ãããããã¾ããã»ã»ã»ãã§ã¯ãªãããã¯ã大人ã®ç¹æ¨©ããçºåããã¨ãããã¹ï¼ã¨ãããã¨ã§ããªã¼ã¯ã·ã§ã³ã§è½æãããã®ãæã¡æ©ãã¦ãã¾ã(äºåæ©ã¾ã§è³¼å ¥ãã¾ãã)ãã·ã¹ãã ãã¯ãã§ãã©ãã·ã¥ã«ã¼ãã«èªåä¿åãã¦ãããã¼ã¿ãããäºå®è¡¨ã®ãã¼ã¿ã復å ããã¨ãããæå¾ã«ä½¿ç¨ãã¦ããã®ã¯ 1997 å¹´ 11 æã¨å¤æãã¾ãããé£çµ¡å ãå«ãã 18 å¹´åã®ç°å¢ãã¬ã¸ã¥ã¼ã ããæ´æ°ãåéãã¾ããã
復å ãããã¼ã¿ã®ä¸ã« FHPPC ã®å·¡åãã¼ã¿ãæ®ã£ã¦ãã¾ãããFHPPC ã¨ã¯ãããã£ãµã¼ãã®ãã©ã¼ã©ã ã®ã²ã¨ã¤ã§ããè¨äºã«æ¸ããããã«ãå½æã¯å¾é課éã ã£ãã®ã§ããªãã©ã¤ã³ã§ã¡ã¼ã«ãã¡ãã»ã¼ã¸ãæ¸ãã¦ãã¢ãã ã§æ¥ç¶ãå±ããã¡ã¼ã«ãæ°çã¡ãã»ã¼ã¸ããã¦ã³ãã¼ããã¦ãã£ããèªãã¨ããã¹ã¿ã¤ã«ã§ãã
èªå®
ã§ãå¤åºå
ã§ã常ææ¥ç¶ãå½ããåã«ãªã£ã¦ããç¾å¨ãèªè
ã®æ¹ã
ããããã£ãµã¼ãããã½ã³ã³éä¿¡ã®ååãèãã¦ãããããªãæ¹ãã»ã¨ãã©ã¨æãã¾ããããããæ¹ã
ã«ã¨ã£ã¦ã¯ããªãã¨ãªã³ãçµã¿åãããã¹ã¿ã¤ã«ã¯ããã«ãå¤ãããã¦ãä¸ä¾¿ããã®è¨äºãæ¸ãã¦ããç§ã¯åç³çåå¨ããã®ããã«æ ãã®ã§ã¯ãªããã¨æãã¾ãã(ã»ã£ã¦ããã¦ãã ãã)
ã§ãç§ã¯ããã«çåãæãã¦ãã¾ãã
ãå¹çãããææ°æ å ±ãå¾ããã¨ãã観ç¹ããã¯ã常ææ¥ç¶ãåªãã¦ããã®ã¯æããã¨ãããå½ããåã§ãããã ãæ¬å½ã«å¹çãææ°ã®æ å ±ãéè¦ã§ããããï¼ãããã¦éããæ å ±ãæ´»ç¨ã§ããã®ã§ããããï¼ãã®çµãããªã追æ±ã®å ã«ã¯ãå®ãããªå¢å°ãå¾ ã£ã¦ããã®ã§ããããï¼
æ¬ã³ã©ã ã®ã¿ã¤ãã«ã¯ãããªã³ã¨ãªããã§ã¯ãªãããªãã¨ãªã³ãã¨ãã¾ãããããã¯ããªã(ã©ã¤ã³)ããã¼ã¹ã§ãæã ãªã³(ã©ã¤ã³)ã§æ´æ°(åæ)ãããã¨ããæå³ã§ãããªãã®æéã¯ãæ°ããªæ å ±ã¯å ¥ãã¾ãããèªåããã¼ã¹ãã³ã³ããã¼ã«ããæéã§ãããè¨ã£ã¦ã¿ãã°ãèªåã主役ã®æéã§ãã常ææ¥ç¶ã®ä¸çã«ã¯åºæ¬çã«ãã®èªåã主役ã®æéãããã¾ããã
ã²ã¨ã¤ä¾ãããã¾ããå人ãã°ã«ã¼ãã®é£çµ¡ã«æ´»ç¨ããã¦ãã SNS ã«LINE ãããã¾ããé»è»ã®ä¸ã§ãããçä¿¡é³ãèãããç»é¢ãè¦ãããããã¾ãã常ææ¥ç¶ã®ä¸çãªã®ã§ãã¾ãã«çµ¶ãéãããã¾ãããç§èªèº«ã¯å©ç¨ãã¦ãã¾ããããä»äººäºãªãããããã§ç¥çµãä¼ã¾ãæãããã®ããã¨å¿é ã«ãªãã¾ããæ¢èªæªæ¢èªã®ç¶æ 表示æ©è½ãããã¨ãããã¨ã§ãããèªãã§ããç¶æ ã¾ã§ç£è¦ãããã®ã¯å人çã«ã¯åå¼ã§ããTwitter ã Facebook ã¯ç§ãå©ç¨ãã¦ãã¾ãããããã便å©ãªãã¼ã«ã ã¨æãã¾ãããããã¾ã§ä½¿ãããªããã ãã®çµé¨ãè½åããã£ã¦ã®ãã¨ã§ãã人ççµé¨ãæµ ããå¤æãªä¸ä»£ã®å©ç¨ã«ã¯æ éã«ãªãã¹ãã ã¨æãã¾ããããªããã¨ããªã³ãããã£ãæ代ãåå¿è ã¯ãã©ã¼ã©ã ãªã©ã®å ´ã§ãæ®ããæ¹ãä»ã®ã¦ã¼ã¶ã¼ã¨ã®ã¤ãããæ¹ãå¦ã³ã¾ããããã³ããã®ä¸ã«ã¬ããããæããããããªã¨ãããããã¾ãããæåããä¸çã«ã¤ãªããã¤ã³ã¿ã¼ãããã¯ãèªç±ã§ããèªå·±è²¬ä»»ãæ±ãã¦ããé¨åãããã¨æãã¾ãã
ãããã£ãµã¼ãã¯2009å¹´ã«ãµã¼ãã¹ãçµäºãã¾ãããéå®å ¬éããã¦ããã³ãã¥ããã£ãµã¤ããã¡ã¢ãªã¢ã«ãµã¤ãã2014å¹´5æã«çµäºãã¦ãã¾ããããããã«å¸°ããã¨ã¯ã§ãã¾ããããå¿ãç©ãæ¢ããã¨ã¯ã§ããããããã¾ããã
ã¨ããã§ãæ¡å ãé ãã¾ããããæ¬ã³ã©ã ã®è¨äºã«ã¯ã Twitter 㨠Facebook ã®ãã¿ã³ãé ç½®ããã¦ãã¾ãããããããã°æ¯éãé¡ããããã¾ãï¼ããã®ã¼ã£ã¦ï¼ã
ï¼åç°å£æ ï¼
Tweet