백 스테이지 개발

앞 에 쓰다
github 주소,좋아요 눌 러 주시 면 환영 합 니 다.계속 업 데 이 트 됩 니 다...
https://github.com/emaste-r/backend_note

장절 목록
  • 실행 중인 업무 프로 세 스 CPU 조정
  • Java 튜 닝
  • Python 튜 닝
  • Mysql 일상 최적화
  • Mysql 느 린 조회 로그 보기
  • Mysql 실행 중인 sql
  • Nginx 는 가장 자주 방문 하 는 IP 를 보고 이상 IP 를 금지 합 니 다.
  • firewall-cmd
  • iptables

  • 하 드 디스크 모니터링 및 메 일 경고
  • 실행 중인 업무 프로 세 스 CPU 조정
    자바 변조
    CPU 이상 PID 먼저 찾기:
    [root@iZ9458z0ss9Z ~]# top -c

    그리고 이 프로 세 스 의 스 레 드 를 봅 니 다:
    [root@iZ9458z0ss9Z ~]# top -Hp YOUR_PID

    그리고 이상 한 라인 보기:
    [root@iZ9458z0ss9Z ~]# jstack YOUR_THREAD_PID

    이렇게 하면 이 스 레 드 가 어느 코드 까지 실행 되 고 있 는 지 볼 수 있 습 니 다.CPU 이상 이 발생 할 수 있 습 니 다.
    [root@iZ94won0vbvZ ~]# printf '%x
    ' 15589
    3ce5 [root@iZ94won0vbvZ ~]# jstack 15589 | grep "3ce" -C 5 "qtp540159270-15" #15 prio=5 os_prio=0 tid=0x00007f312878e000 nid=0x3cfd waiting on condition [0x00007f311115f000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000e002b348> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) -- at org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:531) at org.eclipse.jetty.util.thread.QueuedThreadPool.access$700(QueuedThreadPool.java:47) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:590) at java.lang.Thread.run(Thread.java:745)

    다음 오류 가 발생 할 수 있 습 니 다:
    Unable to open socket file: target process not responding or HotSpot VM not loaded

    원인:
    jstack   pid  。

    해결 방안:
    1、     pid    /tmp    ,  tmpwatch           /tmp              ...
                 pid;
    2、    pid           ,  jstack /data/you/path/your.pid  。

    파 이 썬 튜 닝
    본인 버 전:
    centos7+python2.7.5   

    gdb 설치:
    [root@iZ9458z0ss9Z ~]# sudo yum install gdb

    다음 정보 가 나타 나 면 설치 성공 을 설명 합 니 다.
    [root@ouyang ~]# gdb
    GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7_4.1
    Copyright (C) 2013 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later 
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-redhat-linux-gnu".
    For bug reporting instructions, please see:
    .
    (gdb) 

    python 패키지 설치(py-list,py-bt 등 을 사용 할 수 있 습 니 다):
    wget http://debuginfo.centos.org/6/x86_64/python27-python-debuginfo-2.7.5-10.el6.centos.alt.x86_64.rpm
    rpm -ivh python27-python-debuginfo-2.7.5-10.el6.centos.alt.x86_64.rpm

    python-debuginfo 패키지 설치 성공 에 대한 다음 정보 가 나타 납 니 다.
    [root@iZ94won0vbvZ ~]# gdb -p 31618 # 31618    python   PID
    
    (gdb) py
    py-bt               py-down             py-list             py-locals           py-print            py-up               python              python-interactive  

    디 버 깅 을 시작 합 니 다.현재 스 레 드 가 실행 중인 코드 를 보십시오.
    (gdb) py-list
     858                        # clear alarm so it doesn't fire while poll is waiting for
     859                        # events.
     860                        signal.setitimer(signal.ITIMER_REAL, 0, 0)
     861    
     862                    try:
    >863                        event_pairs = self._impl.poll(poll_timeout)
     864                    except Exception as e:
     865                        # Depending on python version and IOLoop implementation,
     866                        # different exception types may be thrown and there are
     867                        # two ways EINTR might be signaled:
     868                        # * e.errno == errno.EINTR
    (gdb) 

    Mysql 일상 최적화
    Mysql 느 린 조회 로그 보기
    우선 my sql 이 느 린 조회,느 린 조회 로그 저장 위 치 를 열 었 는 지 판단 해 야 합 니 다.
    [root@iZ9458z0ss9Z ~]#  cat /etc/my.cnf| grep slow           
    slow_launch_time=2  #                     ,slow_launch_threads       
    slow_query_log=on   #       
    slow_query_log_file=/data/log/your_slow_query.log  # log      

    만약 열 리 지 않 았 다 면 어떻게 열 었 을까요?
    mysql> set global slow_query_log='ON'; 
    mysql> set global slow_query_log_file='/usr/local/mysql/data/slow.log';
    mysql> set global long_query_time=1;  #            

    느 린 조회 로그 보기,주요 관심 인자:Querytime=몇 초 걸 리 는 지 알 아 보기=3.088468 Rowsexamined=영향의 행 수=43817
    [root@iZ9458z0ss9Z ~]# tail -f /data/log/your_slow_query.log
    # Time: 180301 16:17:20
    # User@Host: root[root] @ iZ9458z0ss9Z [10.24.245.83]
    # Thread_id: 9601563  Schema: miaoyan  QC_hit: No
    # Query_time: 3.088468  Lock_time: 0.000084  Rows_sent: 1  Rows_examined: 43817
    # Rows_affected: 0
    SET timestamp=1519892240;
    select count(id) as cnt from `your_table` where com_id = 1867 and ptype = 1;

    Mysql 실행 중인 sql 보기
    현재 sql 실행 상황 보기:
    mysql> show processlist;
    +----------+---------+----------------------+----------------------+---------+-------+----------+------------------+
    | Id       | User    | Host                 | db                   | Command | Time  | State    | Info             |
    +----------+---------+----------------------+----------------------+---------+-------+----------+------------------+
    | 15490667 | seafile | localhost:45682      | ccnet-db             | Sleep   |    23 |          | NULL             |
    | 15490668 | seafile | localhost:45684      | seafile-db           | Sleep   |     3 |          | NULL             |
    | 15496875 | seafile | localhost:60158      | ccnet-db             | Sleep   |  1530 |          | NULL             |
    | 15498263 | seafile | localhost:35184      | seafile-db           | Sleep   |   630 |          | NULL             |
    | 9604402  | root    | iZ9458z0ss9Z:22193   | your_db              | Query   |     1 | Sending data                                                                  | select count(id) as cnt from `your_table` where com_id = 1769 and ptype=1 |

    Sleep 상태의 항목 은 상관 할 필요 가 없습니다.Query 상태의 sql 을 보면 Time(초)이 너무 커서 걸 릴 수 있 습 니 다.개인 적 으로 select 의 sql 이 걸 리 면 먼저 kill 할 수 있 습 니 다.
    kill 9604402

    색인 이 있 는 지 천천히 분석 합 니 다.
    explain select count(id) as cnt from `your_table` where com_id = 1769 and ptype=1;

    Update 의 sql 이 라면 천천히 실행 이 끝 날 때 까지 기다 리 세 요.보통 시간 이 많이 걸 리 지 않 습 니 다.
    Nginx 는 가장 자주 방문 하 는 IP 를 보고 이상 IP 를 금지 합 니 다.
    상위 10 개 방문 이 가장 잦 은 IP 보기:
    [root@iZ9458z0ss9Z ~]# awk '{a[$1]+=1;}END{for(i in a){print a[i] " " i;}}' /var/log/nginx/access.log |sort -gr | head -10                          
    11929 123.44.55.66
    9727 119.137.52.231
    8132 111.18.73.48
    2926 115.191.176.18
    2407 183.198.212.108
    2322 218.11.141.142
    2257 183.225.60.104
    2229 183.40.130.198
    1990 115.207.217.131
    1965 221.180.236.146
    [root@iZ9458z0ss9Z ~]# 

    firewall-cmd
    만약 에 우리 가 이 123.44.5.66 이 너무 수상 하 다 고 느낀다 면 firewall 을 사용 하지 않 는 방법:먼저 firewall 이 켜 졌 는 지 확인 하 십시오.
    [root@iZ9458z0ss9Z ~]# firewall-cmd --state
    running

    123.44.5.66 사용 안 함:
    [root@iZ9458z0ss9Z ~]# firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='123.44.55.66' reject"
    success

    재 부팅 적용:
    [root@iZ9458z0ss9Z ~]# firewall-cmd --reload
    success
    [root@iZ9458z0ss9Z ~]# iptables -L | grep '123'
    REJECT     all  --  123.44.55.66         anywhere             reject-with icmp-port-unreachable

    IP 봉인 해제,-add-rich-rule 을-remove-rich-rule 로 변경:
    [root@iZ9458z0ss9Z ~]# firewall-cmd --permanent --remove-rich-rule="rule family='ipv4' source address='123.44.55.66' reject"

    iptables
    firewall-cmd 가 설치 되 어 있 지 않 으 면 iptables 를 시도 해 보 세 요.먼저 iptables 서비스 가 달 리 는 지 확인 하 세 요.
    [root@iZ94won0vbvZ ~]# service iptables status

    뛰 지 않 았 다 면:
         
          : chkconfig iptables on
          : chkconfig iptables off
        ,     
          : service iptables start
          : service iptables stop

    ip 거부 규칙 추가:
    [root@iZ9458z0ss9Z ~]# cp /etc/sysconfig/iptables-config  /var/tmp   //       
    [root@iZ9458z0ss9Z ~]# iptables -I INPUT -s 123.44.55.66 -j DROP //     ip
    [root@iZ9458z0ss9Z ~]# service iptables save  //    
    [root@iZ9458z0ss9Z ~]# service iptables restart //     

    추가 성공 여부 보기:
    [root@iZ94won0vbvZ ~]# iptables -L  //  iptables
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       all  --  123.44.55.66         anywhere            
    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

    오해 가 발견 되면 123.44.55.66 을 해제 하고 싶 습 니 다.
    [root@iZ94won0vbvZ ~]# iptables -D INPUT -s 123.44.55.66 -j DROP
    [root@iZ94won0vbvZ ~]# iptables -L | grep 123.44.55   //      123.44.55.66      ,    !
    [root@iZ94won0vbvZ ~]# 

    하 드 디스크 모니터링 및 메 일 경보
    하 드 디스크 사용량 df-h:
    [root@iZ9458z0ss9Z script]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vda1        40G   14G   24G  36% /
    devtmpfs        3.9G     0  3.9G   0% /dev
    tmpfs           3.9G   28K  3.9G   1% /dev/shm
    tmpfs           3.9G  408M  3.5G  11% /run
    tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
    /dev/vdb        197G  124G   64G  66% /data
    tmpfs           783M     0  783M   0% /run/user/0

    만약 mail 을 설정 한 적 이 없다 면:
    [root@001 ~]# vim /etc/mail.rc #      
    set from=xxxx@126.com  # from:             
    set smtp=smtp.126.com  # smtp:         smtp     
    set smtp-auth-user=xx@126.com  # set smtp-auth-user:          
    set smtp-auth-password=xxx  # set smtp-auth-password:        ,          
    set smtp-auth=login # smtp-auth:SMTP     ,   login,     CRAM-MD5 PLAIN  

    테스트 아래:
    [root@iZ9458z0ss9Z script]# echo "    " | mail -s "    " xihuanjianguo@163.com

    메 일 을 보 내 는 스 크 립 트 쓰기:
    [root@iZ9458z0ss9Z script]# cat sendmail.sh 
    #!/bin/bash
    # by kin
    source /etc/profile
    content=$1
    address=$2
    echo ${content} | mail -s ${content} ${address}

    감시 하 드 디스크 스 크 립 트 쓰기:
    [root@iZ9458z0ss9Z ~]# cat /data/your_script_path/hdd_alarm.sh 
    #!/bin/sh
    # by kin
    source /etc/profile;
    runpath='/data/your_script_path'
    
    #   send        sendmail.sh  
    send()
    {
      ./sendmail.sh $1 your_email_1@163.com
      ./sendmail.sh $1 your_email_2@163.com
    }
    
    #      hdd_alarm       
    if [ ! -d  $runpath/hdd_alarm ]
    then
            mkdir $runpath/hdd_alarm
    fi
    
    #      IP  
    Host_IP=`ifconfig |grep "inet "|grep -v 127.0.0.1|grep -v 'inet 10.'|grep -v '192.168'|awk '{print $2}'`
    
    
    #   df             a   b,  a b
    df -h | awk '{print $(NF-1),$NF}'|awk '{if($NF!=$1){print $0}}'|sed 's/\%//g'|sed '1d'|while read a b;
    do
    
    #   a b           
    if [ -z $a ] || [ -z $b ] 
    then      
            :
    else
            #                
            old_used=`cat $runpath/hdd_alarm/hdd_tmp.log 2>/dev/null|grep "$b$"|awk '{print $(NF-1)}'|sed 's/\%//g'`
    
            #         80             ,   
            if [ ! -z $old_used ] && [ $old_used -eq $a ] &&  [ $a -le 80 ]
            then
                    continue;
            fi
    
            #        >=80,   send()    ...
            if  [ $a -gt 80  ] ; 
            then
                    msg="Hdd_alarm:$Host_IP-$b-Reach-$a-precent"
                    echo "$msg" #>>./Hdd_alarm.log
                    send "$msg"
    
                    #     send()      0,     
                    if [ $? -ne 0 ]; 
                    then
                            echo -e "############Send Fail#############"
                    fi
            fi
    
    
    fi
    done
    
    #  df        ,       
    df -h >$runpath/hdd_alarm/hdd_tmp.log
    

    정시 퀘 스 트 를 놓 고 15 분 마다 한 번 씩 달 립 니 다.
    [root@iZ9458z0ss9Z script]# crontab  -l
    */15 * * * *  cd /data/your_script_path/;./hdd_alarm.sh >/dev/null 2>&1

    좋은 웹페이지 즐겨찾기