Skip to content
조회 수 6236 추천 수 0 댓글 3
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

서버 하드웨어 & 소프트웨어 사양

Zeon E5430 2.66GHz X 2EA
Core:8

8GB Ram

Sandisk X300 256GB SSD

Windows 2012

AutoSET 9.0
 1. Apache HTTPD Server 2.4.10
; IPv6 Crypto apr-1.5.1 apr-util-1.5.3 apr-iconv-1.2.1 openssl-1.0.1i zlib-1.2.8 pcre-8.35 libxml2-2.9.1 lua-5.1.5 expat-2.1.0
PHP 5.6.0
 2. MySQL Community Server 5.6.20
 3. phpMyAdmin 4.2.9 All language

 

가장 중요한 하드웨어 성능

하드웨어가 뛰어나다면 동시접속자는 일어나지 않을것이다.

동시접속자란 

  하나의 작업이 처리완료 되기전에 다른작업이 끼어드는 상황을 말하는 것이며 이는 컴퓨터가 빨리 처리해버린다면 동시접속이 일어날 이유가 없다.

  동시접속을 처리해야 하는 상황에서 버퍼는 아주 중요하다.

 

윈도우 최적화

 

부팅시 [CTRL+ALT+DEL] 없이 시작하기

 

  • 시작=>실행=>gpedit.msc 입력 후 컴퓨터구성=>windows 설정=>보안설정=>로컬정책=>보안옵션=>대화형로그온 ctrl+alt+del 더블클릭 또는 속성으로 들어가 [사용]을 체크한 후 확인을 누릅니다.

 

 

윈도우의 자동 로그온 방법 

 

  • 부팅시부터 암호 없이 자동적으로 로그온 설정 실행(또는 윈도우키 + R) => netplwiz 또는 control userpasswords2 자동 로그인할 계정을 먼저 선택 후 "사용자 이름과 암호를 입력해야 이 컴퓨터를 사용할 수 있음" 항목의 체크를 제거 설정을 저장하기 위해 확인 또는 적용을 누르면 암호를 입력하는 새로운 창이 나타나는데, 자동 로그온할 해당 계정의 암호를 입력해주면 암호를 미리 저장하여 부팅 후 로그온시 암호입력이 필요없어진다.

 

Windows Server 2012 인터넷 설정

 부팅된 server 2012에서 인터넷을 편하게 하기 위해 "IE 보안 강화 구성" 을 사용안함으로 해주어야 합니다.

 개편된 GUI에서 찾기 힘드실까봐 이미지를 포함해 알려드리겠습니다.

 
 

로컬 IP 입력으로 서버간 입출력 속도개선하기

웹서버와 DB서버 간 도메인으로 연결할 경우 도메인에서 IP로의 변경작업이 필요하다.
localhost 또한 도메인으로 127.0.0.1 로 변경작업을 수행하므로 차라리 127.0.0.1 로 입력하는 것이 속도개선이 될 수 있다.
컴퓨터 내부적으로도 도움이 되려면
 
hosts 파일에
 

 127.0.0.1       localhost 

을 입력해두면 속도개선에 많은 도움이 될 것이다.
 
 

 

 

 

 

윈도우 time_wait 없애기

TIME_WAIT 상태가 늘어나면 서버의 소켓이 고갈되어 커넥션 타임아웃이 발생한다는 얘기를 한다.

 

 

서버 방화벽에서 80번 포트 열기

 
 
 
 
 
 


서버 최적화 시키기


1. 압축(Compression)
2. 캐싱(Caching)
3. 버퍼(Buffer)

1,2,3에 해당하는 작업이 충실이 되면 10배 이상의 효율을 가져올 수 있다.

압축은 CPU에 부담을 줄 수 있지만 전송할 데이터의 사이즈를 줄이기 때문에 전송완료에 도움이 된다.

캐싱은 어떤 일을 처리할때 문제를 보고 답을 적느냐? 답만 알고 적느냐의 차이라고 볼 수 있다.

A B
 1+1=     1    
 1+2=     2  

결과는 1,2 인데, A와 B 중 당연히 A를 처리해야 되는 시간이 오래 걸린다.

결과물이 같다면 미리 계산된 데이터를 저장 해놓고 요청시에 전달만 하면되는 것이 캐싱이다.

 


아파치 최적화

확장모듈 
mod_deflate.so
mod_expires.so

 

 

이건 적용해봤으나 제서버에서는 부작용...

 

http://dumpcookie.tistory.com/entry/mod-disk-cache%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-XpressEngine-%EC%86%8D%EB%8F%84-%ED%96%A5%EC%83%81%EC%8B%9C%ED%82%A4%EA%B8%B0

 

XpressEngine에도 mod_disk_cache를 간단히 적용해보았습니다.

주의할 점

실제로 mod_disk_cache를 제대로 적용하기 위해서는 세션 쿠키 등등을 최소화하여 캐싱이 유리하도록 만들고, 익명 사용자에 대해서는 세션쿠키를 쓰지 말고 별도로 처리하면 캐싱이 유리하게 됩니다.

이 문서는 단순히 s-maxage=3으로 세팅하는 매우 간단한 패치이며, mod_disk_cache의 효과를 아파치벤치라는 간단한 벤치마크 툴로 테스트하는 결과를 보여주므로 실제로 사용자가 느낄 수 있는 성능 향상과는 괴리가 있을 수 있습니다.

 

XpressEngine에 적용하기

XE 버전 1.7.x에 대해서 작성했습니다. 패치로 만드는 대신에 다음과 같이 수동으로 고치는 방식을 설명합니다.

1) classes/display/DisplayHandler.class.php 파일에서 다음 함수를 찾아서 Expires, Cache-Control, Pragma 헤더 삭제.

 

?


/**  * print a HTTP HEADER for HTML, which is encoded in UTF-8  * @return void  */

 

 function _printHTMLHeader() {         header("Content-Type: text/html; charset=UTF-8");         

#header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); # 제거         

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");              

#header("Cache-Control: no-store, no-cache, must-revalidate"); # 제거         

header("Cache-Control: s-maxage=3, max-age=0, must-revalidate");              

header("Cache-Control: post-check=0, pre-check=0", false);         

#header("Pragma: no-cache"); # 제거 

}

 


<embed allowscriptaccess="never" enablecontextmenu="false" flashvars="&callbackId=dumpcookietistorycom214859&host=http://dumpcookie.tistory.com&embedCodeSrc=http%3A%2F%2Fdumpcookie.tistory.com%2Fplugin%2FCallBack_bootstrapper%3F%26src%3D%2F%2Fs1.daumcdn.net%2Fcfs.tistory%2Fresource%2F2380%2Fblog%2Fplugins%2FCallBack%2Fcallback%26id%3D21%26callbackId%3Ddumpcookietistorycom214859%26destDocId%3Dcallbacknestdumpcookietistorycom214859%26host%3Dhttp%3A%2F%2Fdumpcookie.tistory.com%26float%3Dleft" height="1" id="bootstrapperdumpcookietistorycom214859" src="http://dumpcookie.tistory.com/plugin/CallBack_bootstrapperSrc?nil_profile=tistory&nil_type=copied_post" swliveconnect="true" type="application/x-shockwave-flash" width="1" wmode="transparent">

2) classes/context/Context.class.php 파일에서 session_start()를 찾아서 session_cache_limiter('') 추가

 

?


session_cache_limiter(''); # 추가

session_start();

 

이렇게 고치면 끝.

테스트 결과

아파치 벤치(ab -n 1000 -c 3 http://localhost/xe/)로 테스트해보니 다음과 같은 결과가 나왔습니다.

 

 

... Concurrency Level: 3 Time taken for tests: 0.433 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 9072075 bytes HTML transferred: 8596000 bytes Requests per second: 2309.36 [#/sec] (mean) Time per request: 1.299 [ms] (mean) Time per request: 0.433 [ms] (mean, across all concurrent requests) Transfer rate: 20459.63 [Kbytes/sec] received

  

 

 

모바일보다 PC 재접속시 획기적으로 가속화 된다.
압축은 CPU에 부담을 주지만 사이즈를 줄여 빠른 전송을 할 수 있다.
압축율을 높이는 건 비효율적이므로 필요없다.


아파치 모듈 mod_deflate 압축하기

#압축하기

SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|bmp|zip|tar|rar|alz|a00|ace|txt|mp3|mpe?g|wav|asf|wma|wmv|swf|exe|pdf|doc|xsl|hwp|java|c|t?gz|bz2|7z)$ no-gzip dont-vary

  BrowserMatch ^Mozilla/4 gzip-only-text/html   # Netscape 4.xx에는 HTML만 압축해서 보냄
  BrowserMatch ^Mozilla/4\.0[678] no-gzip   # Netscape 4.06~4.08에는 압축해서 보내지 않음
  #BrowserMatch \bMSIE !no-gzip !gzip-only-text/html   # 자신을 Mozilla로 알리는 MSIE에는 그대로 압축해서 보냄

[Apache] mod_expires .htaccess을 수정하여 브라우저 캐싱하기

 


ExpiresActive on
 
ExpiresDefault                          "access plus 1 weeks"
 
ExpiresByType text/cache-manifest       "access plus 0 seconds"
ExpiresByType text/html                 "access plus 0 seconds"
ExpiresByType text/xml                  "access plus 0 seconds"
ExpiresByType application/xml           "access plus 0 seconds"
ExpiresByType application/json          "access plus 0 seconds"
 
ExpiresByType application/rss+xml       "access plus 0 seconds"
ExpiresByType application/atom+xml      "access plus 0 seconds"
 
ExpiresByType image/gif                 "access plus 1 weeks"
ExpiresByType image/png                 "access plus 1 weeks"
ExpiresByType image/jpg                 "access plus 1 weeks"
ExpiresByType image/jpeg                "access plus 1 weeks"
   
ExpiresByType video/ogg                 "access plus 2 weeks"
ExpiresByType audio/ogg                 "access plus 2 weeks"
ExpiresByType video/mp4                 "access plus 2 weeks"
ExpiresByType video/webm                "access plus 2 weeks"
   
ExpiresByType text/x-component          "access plus 1 weeks"
ExpiresByType application/x-font-ttf    "access plus 1 weeks"
ExpiresByType font/opentype             "access plus 1 weeks"
ExpiresByType application/x-font-woff   "access plus 1 weeks"
ExpiresByType image/svg+xml             "access plus 1 weeks"
ExpiresByType application/vnd.ms-fontobject "access plus 1 weeks"
ExpiresByType text/css                  "access plus 1 weeks"
ExpiresByType application/javascript    "access plus 1 weeks"
ExpiresByType image/x-icon              "access plus 1 weeks"
 

 

#CSS, JS 파일 Minify로 한꺼번에 압축해서 전송하기

RewriteRule ^(.*\.(css|js))$ ./min/index.php?f=$1 [L]

 

#아파치 2.4 압축하기

SetOutputFilter DEFLATE

#(원본)SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|bmp|zip|tar|rar|alz|a00|ace|txt|mp3|mpe?g|wav|asf|wma|wmv|swf|exe|pdf|doc|xsl|hwp|java|c|t?gz|bz2|7z)$ no-gzip dont-vary

SetEnvIfNoCase Request_URI \.(?:bmp|zip|tar|rar|alz|a00|ace|txt|mp3|mpe?g|wav|asf|wma|wmv|swf|exe|pdf|doc|xsl|hwp|java|c|t?gz|bz2|7z)$ no-gzip dont-vary

  BrowserMatch ^Mozilla/4 gzip-only-text/html   # Netscape 4.xx에는 HTML만 압축해서 보냄

  BrowserMatch ^Mozilla/4\.0[678] no-gzip   # Netscape 4.06~4.08에는 압축해서 보내지 않음

  #BrowserMatch \bMSIE !no-gzip !gzip-only-text/html   # 자신을 Mozilla로 알리는 MSIE에는 그대로 압축해서 보냄

 

 

 

PHP 캐싱

PHP Opcache 속도개선 시키기

PHP Opcache 적용 전과 후의 비교

 

php.ini 설정

pcre

PCRE (Perl Compatible Regular Expressions) Support enabled
PCRE Library Version 8.34 2013-12-15
Directive Local Value Master Value
pcre.backtrack_limit 1000000 1000000
pcre.recursion_limit 500000 500000

 

http://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit

pcre.recursion-limit 항목의 기본 값이 100,000으로 설정되어 있으며 이를 조금 늘려주면 됩니다.

 

다른 곳에 넣어도 되지만 파일을 수정하거나 기억하기 쉽도록 index.php에 넣어도 됩니다.

 

?

1

2

define('__XE__',   TRUE);

@ini_set('pcre.recursion_limit', 500000);

 

@ini_set('pcre.recursion_limit', 500000);

이 코드를 추가하면 됩니다.

다만, 이처럼 설정을 변경하는 것을 허용하지 않을 수 있으므로 일부 호스팅에서는 문제가 해결되지 않을 수 있습니다.

 

간단한 테스트로 아래 코드를 .php 파일로 저장해 서버에서 열어봤을 때 오류 등 어떤 메시지가 표시되지 않아야 하며 500000이라는 숫자가 보이면 위 코드가 동작하는 것 입니다.

 

?

1

2

3

<?php

 ini_set('pcre.recursion_limit', 500000);

echo ini_get('pcre.recursion_limit');

 

 

xecenter 레이아웃을 보니 하나의 파일에 너무 많이 것이 들어 있는 것 같습니다.

각 부분별로 분리하면(파일 분리. include) 개선 될 수도 있을 것 같습니다.

확실치는 않네요. 이게 하나 처리 시 적용되는 것인지 프로세스에 제한되는 것인지...

 

 


Mysql

 

MySQL 5.6.2 labs innodb memcached 설치 및 테스트

 

http://labs.mysql.com/
위의 사이트로 가서 "mysql-5.6.2-labs-innodb-memcached-linux2.6-x86_64.tar.gz" 해당 파일을 다운로드 한 이후 설치 하여 테스트 해보았습니다.


16.2 Using MySQL with memcached



설치 이후 가장 기본적으로 버전을 확인 하니 다음과 같습니다.
mysql> select version();
+---------------------------------+
| version()                       |
+---------------------------------+
| 5.6.2-labs-innodb-memcached-log |
+---------------------------------+
1 row in set (0.00 sec)
 
설치 후 바로 사용가능한 엔진은 다음과 같습니다.
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| InnoDB             | YES     | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MyISAM             | DEFAULT | MyISAM storage engine                                          | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
 
총 9개의 엔진이 리스트에 보이며, 활성화 된 엔진은 FEDERATED를 제외한 8개 엔진이 모두 활성화 된 것을 확인 할 수 있습니다.
 
memcache는 이노디비 환경에서만 사용이 가능하다고 하여, 이노디비 버전을 확인 해보았습니다.
mysql> select @@innodb_version;
+------------------+
| @@innodb_version |
+------------------+
| 1.2.2            |
+------------------+
1 row in set (0.00 sec)
 
기본 설치 이후 확인 되는 플러그인 목록을 보니 다음과 같습니다.
mysql> show plugins;
+--------------------------+----------+--------------------+---------+---------+
| Name                     | Status   | Type               | Library | License |
+--------------------------+----------+--------------------+---------+---------+
| binlog                   | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| mysql_native_password    | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
| mysql_old_password       | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
| MRG_MYISAM               | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| CSV                      | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| MyISAM                   | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| MEMORY                   | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| InnoDB                   | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| INNODB_TRX               | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_LOCKS             | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_LOCK_WAITS        | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMP               | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMP_RESET         | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMPMEM            | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMPMEM_RESET      | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_BUFFER_PAGE       | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_BUFFER_PAGE_LRU   | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_BUFFER_POOL_STATS | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_METRICS           | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_TABLES        | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_TABLESTATS    | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_INDEXES       | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_COLUMNS       | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_FIELDS        | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_FOREIGN       | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_FOREIGN_COLS  | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| PERFORMANCE_SCHEMA       | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| BLACKHOLE                | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| FEDERATED                | DISABLED | STORAGE ENGINE     | NULL    | GPL     |
| ARCHIVE                  | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| partition                | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
+--------------------------+----------+--------------------+---------+---------+
31 rows in set (0.00 sec)
 
확인 해보니 memcache가 기본적으로는 지원이 안되는 것으로 보이며, 특이 사항으로는 Innodb 관련하여, 인포메이션 스키마 관련된 항목이 눈에 띄게 늘어난 것을 알 수 있습니다.
 
memchache 플러그인을 설치합니다.
mysql> install plugin daemon_memcached soname "libmemcached.so";
 
mysql> show plugins;
+--------------------------+----------+--------------------+-----------------+---------+
| Name                     | Status   | Type               | Library         | License |
+--------------------------+----------+--------------------+-----------------+---------+
| binlog                   | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| mysql_native_password    | ACTIVE   | AUTHENTICATION     | NULL            | GPL     |
| mysql_old_password       | ACTIVE   | AUTHENTICATION     | NULL            | GPL     |
| MRG_MYISAM               | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| CSV                      | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| MyISAM                   | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| MEMORY                   | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| InnoDB                   | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| INNODB_TRX               | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_LOCKS             | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_LOCK_WAITS        | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_CMP               | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_CMP_RESET         | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_CMPMEM            | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_CMPMEM_RESET      | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_BUFFER_PAGE       | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_BUFFER_PAGE_LRU   | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_BUFFER_POOL_STATS | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_METRICS           | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_SYS_TABLES        | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_SYS_TABLESTATS    | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_SYS_INDEXES       | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_SYS_COLUMNS       | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_SYS_FIELDS        | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_SYS_FOREIGN       | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| INNODB_SYS_FOREIGN_COLS  | ACTIVE   | INFORMATION SCHEMA | NULL            | GPL     |
| PERFORMANCE_SCHEMA       | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| BLACKHOLE                | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| FEDERATED                | DISABLED | STORAGE ENGINE     | NULL            | GPL     |
| ARCHIVE                  | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| partition                | ACTIVE   | STORAGE ENGINE     | NULL            | GPL     |
| daemon_memcached         | ACTIVE   | DAEMON             | libmemcached.so | GPL     |
+--------------------------+----------+--------------------+-----------------+---------+
32 rows in set (0.00 sec)
 
설치가 된 것을 확인 할 수 있습니다.
 
현재 설치된 데이터 베이스 인스턴스를 확인해봅니다.
 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)
 
바이너리 디렉토리의 script-xs 내부를 보면 innodb_memcached_config.sql 파일이 추가된 것을 확인 할 수 있습니다.
SQL 스크립트 파일임으로, 스크립트를 실행시켜서, memcache 설치를 완료 합니다.
 
shell> mysql -uroot  < script-xs/innodb_memcached_config.sql 
 
스크립트를 실행시키자 innodb_memcache 데이터베이스가 추가된 것을 확인 할 수 있습니다.
 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb_memcache    |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)
 
테이블도 확인해 봅니다.
 
mysql> use innodb_memcache;
 
mysql> show tables;
+---------------------------+
| Tables_in_innodb_memcache |
+---------------------------+
| cache_policies            |
| config_options            |
| containers                |
+---------------------------+
3 rows in set (0.00 sec)
 
mysql> select * from cache_policies;
+--------------+-------------+-------------+---------------+--------------+
| policy_name  | get_policy  | set_policy  | delete_policy | flush_policy |
+--------------+-------------+-------------+---------------+--------------+
| cache_policy | innodb_only | innodb_only | innodb_only   | innodb_only  |
+--------------+-------------+-------------+---------------+--------------+
1 row in set (0.00 sec)
 
mysql> select * from config_options;
+-----------+-------+
| name      | value |
+-----------+-------+
| separator | |     |
+-----------+-------+
1 row in set (0.00 sec)
 
mysql> select * from containers;
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
| name | db_schema | db_table  | key_columns | value_columns | flags | cas_column | expire_time_column | unique_idx_name_on_key |
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
| aaa  | test      | demo_test | c1          | c2            | c3    | c4         | c5                 | PRIMARY                |
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
1 row in set (0.00 sec)
t
est 데이터베이스에 demo_test 테이블이 등록된 것을 확인할 수 있습니다.
 
mysql> use test
 
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| demo_test      |
+----------------+
1 row in set (0.00 sec)
 
mysql> select * from demo_test;
+----+--------------+------+------+------+
| c1 | c2           | c3   | c4   | C5   |
+----+--------------+------+------+------+
| AA | HELLO, HELLO |    8 |    0 |    0 |
+----+--------------+------+------+------+
1 row in set (0.00 sec)
 
테스트 데이터 베이스의 내용을 확인하니 다음과 같습니다.
 
이제 NoSQL을 테스트 하기 위해서, 텔넷으로 접속하고, set명령어와 get명령어를 실행해봅니다.
 
shell> telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set a11 10 0 9
123456789
STORED
get a11
VALUE a11 10 9
123456789
END
 
파란색 글자 부분만 입력하며, 실행 결과는 위와 같습니다.
 
다시 mysql 콘솔로 접속하여, 실제 테이블에 반영된 것을 확인해봅니다.
 
mysql> use test
 
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| demo_test      |
+----------------+
1 row in set (0.00 sec)
mysql> select * from demo_test;
+----+--------------+------+------+------+
| c1 | c2           | c3   | c4   | C5   |
+----+--------------+------+------+------+
| AA | HELLO, HELLO |    8 |    0 |    0 |
+----+--------------+------+------+------+
1 row in set (0.00 sec)
 
아직 반영이 안된 것을 볼 수 있습니다.
 
다음 명령어를 실행하여, 현재 세션에서 커밋이 안된 데이터를 읽을 수 있도록 설정합니다.
 
mysql> set session TRANSACTION ISOLATION LEVEL read uncommitted;
 
mysql>  select * from demo_test;
+-----+--------------+------+------+------+
| c1  | c2           | c3   | c4   | C5   |
+-----+--------------+------+------+------+
| a11 | 123456789    |   10 |    1 | NULL |
| AA  | HELLO, HELLO |    8 |    0 |    0 |
+-----+--------------+------+------+------+
2 rows in set (0.00 sec)
 
set으로 입력한 데이터가 보이는 것을 알 수 있습니다.
 
위와 같이 5.6버전에서 새롭게 제공하는 memcache에 대해서 설치 테스트를 진행 하였습니다.

 

튜닝참고 (일정한 튜닝 이상은 크게 작용하지 않는다.)

 

#MySQL 메모리 사용량

#  +    innodb_buffer_pool_size

#  +    key_buffer

#  +    max_connections * (join_buffer + record_buffer + sort_buffer + thread_stack + tmp_table_size)

#  +    max_connections * 2MB

 

#================================================================

#              튜닝참조

#================================================================

#  1. Opened_tables가 크면 table_open_cache variable의 값이 너무 작은 것일지도 모른다

#  2. key_reads가 크면 key_cach의 값이 너무 작은 것일지도 모른다

#  3. cache hit rate은 key_reads/key_read_requests이다

#  4. Handler_read_rnd가 크면 MySQL의 모든 테이블을 스캔하는 많은 쿼리가 있다거나 key를 적절히 사용하지 않는 조인들이 있을지 모른다

#  5. Threads_created가 크면 thread_cache_size값을 증가시키기를 바랄수도 있다

#  6. Created_tmp_disk_tables이 크면 디스크대신 임시테이블메모리를 얻기위해 tmp_table_size값을 증가시키기를 원할 수있다

#  7. 기본적으로 support-files밑에 my-huge.cnf, my-large.cnf, my-medium.cnf, my-small.cnf 를 기본으로 my.cnf 로 바꾸어 사용하면서 조정한다.

#           - memory (>=256M)이고 많은 테이블이 있으며, 적당한 클라이언트수에서 최고 성능을 유지하기 위해

#             shell> safe_mysqld -O key_buffer=64M -O table_cache=256 -O sort_buffer=4M -O record_buffer=1M &

#             이러한 옵션으로 서버를 실행하는데, my-cnf에서 이를 수정하여 사용하면 될 것이다.

#           - 128M메모리에 테이블이 적지만, 정렬이 많을 때

#             shell> mysqld_safe -O key_buffer=16M -O sort_buffer=1M

#           - 메모리는 적지만 많은 연결이 있을 때

#             shell> mysqld_safe -O key_buffer=512k -O sort_buffer=100k -O record_buffer=100k &

#         또는

#             shell> mysqld_safe -O key_buffer=512k -O sort_buffer=16k -O table_cache=32 -O record_buffer=8k -O net_buffer=1K &

 

#  8. group by와 order by작업이 가지고 있는 메모리보다 훨씬 클 경우, 정렬 후 row 읽는 것을 빠르게 하기위해 record_buffer값을 증가시켜라 

 

 

[client]

port=3306

 

[mysql]

default-character-set=utf8

 

[mysqld]

#bind-address = 127.0.0.1

port=3306

wait_timeout=30          # 커넥션 최대 대기시간(초)

connect_timeout = 5

federated

 

#2016-07-26 추가

binlog_cache_size = 50M 

max_binlog_size = 256M

expire_logs_days=1

 

#skip-external-locking

#skip-host-cache

#skip-locking

 

#skip-name-resolve                # 역DNS 검색비활성

myisam_use_mmap = 1

 

basedir=C:/AutoSet9/Server/MySQL5/

datadir=C:/AutoSet9/Server/MySQL5/Data/

init_connect=SET NAMES utf8

character_set_server=utf8

collation_server=utf8_general_ci

socket=C:/AutoSet9/Server/temp/mysql.sock

 

slow_query_log=1

slow_query_log_file=C:/AutoSet9/Server/MySQL5/Data/mysql-slow.log

long_query_time=2

 

 

character-set-server=utf8

#default-storage-engine=MyISAM                                # 기본엔진설정

default-storage-engine=INNODB                                # 기본엔진설정

 

#back_log = 100                    # 동시접속시 대기시킬수있는 커넥션 갯수

#sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

max_connections=300

max_allowed_packet=4M             # 요청된 쿼리의 최대길이의 값

max_connect_errors = 1000000

 

query_cache_type = 1

query_cache_size = 1024M        # 쿼리개시 증가 이후 (Innodb buffer pool pages dirty디스크에 저장이 필요한 페이지 수)가 원할하게 작동함.쿼리 결과를 캐싱라기 위해 할당된 메모리크기 2016-11-23 = 256

#query_cache_Limit = 2M        # 이  변수 값보다 큰 값은 캐싱이 안됨

 

#table_cache (MaxFileOpen-MaxConnection-(temporary table 에 사용되는 파일핸들) ) / 2

table_open_cache = 2048 # 각 쓰레드별 오픈할 테이블수

table_definition_cache = 12048 #table_open_cache와 같게 할때는 open tables 값이 빠르게 포화상태에 이르렀지만 10배로 늘린 후 느리게 도달하지만 결국 포화상태...

 

#[mysql] Created tmp disk tables 디스크 쓰기방지 대안」 http://urin79.com/20662568.

tmp_table_size = 1024M           # 메모리 내의 임시테이블 크기  초과시 디스크에 저장

max_tmp_tables = 1024 # 2016-09-18 = 64 2016-11-24 = 256 

max_heap_table_size = 1024M     # MEMORY 테이블의 최대크기

 

#늘려보고 줄여봤지만 큰 변화 없음 최근16

thread_cache_size = 32 # 2016-09-18 = 16 다쓴 쓰레드를 스레드풀에 저장할 갯수이 값은 bytes 단위 등의 크기가 아니다.

open_files_limit=12480

thread_concurrency = 16     # 2016-09-18 = 8  쓰레스 갯수

#slave_parallel_workers = 16

 

concurrent_insert=2

 

skip-external-locking

#skip-name-resolve

 

myisam_max_sort_file_size=1G

myisam_sort_buffer_size=16M

 

# key_buffer_size+(record_buffer+sort_buffer)*max_connections < 실메모리양>

#key_buffer_size=256M

#read_buffer_size=8M

#bulk_insert_buffer_size=8M

#read_rnd_buffer_size=16M

#sort_buffer_size=16M

#join_buffer_size=8M

 

#2016-09-09

key_buffer_size=128M

read_buffer_size=4M

bulk_insert_buffer_size=4M

read_rnd_buffer_size=16M

sort_buffer_size=16M #정렬 메모리에 유지되어 4M 이상 하는 것이 좋다.

join_buffer_size=16M #정렬 메모리에 유지되어 4M 이상 하는 것이 좋다.

 

 

 

 

#http://gywn.net/2012/09/mysql-tuning/

#서비스 정책에 따라 다르게 설정하겠지만, 저는 일반적으로 2값으로 세팅합니다.

# 0: 초당 1회씩 트랜잭션 로그 파일(innodb_log_file)에 기록

# 1: 트랜잭션 커밋 시 로그 파일과 데이터 파일에 기록

# 2: 트랜잭션 커밋 시 로그 파일에만 기록, 매초 데이터 파일에 기록

# 1=트랜젝션 실행할때마다 로그 파일에 기록되고 디스크 플러시가 실행

innodb_data_home_dir="C:/AutoSet9/Server/MySQL5/Data/"

innodb_flush_log_at_trx_commit=2

innodb_log_buffer_size=2M

innodb_log_buffer_size=128M

 

#InnoDB에게 할당하는 버퍼 사이즈로 50~60%가 적당하며, 지나치게 많이 할당하면 Swap이 발생할 수 있습니다.

innodb_file_per_table=1            # 테이블 단위로 테이블스페이스 할당, 활성시 확장자 .ibd 파일이생성됨

innodb_buffer_pool_size=4G

#innodb_additional_mem_pool_size = 4M     # 데이터 디렉토리 정보와 내부 데이타 구조를 저장하는 메모리 풀의 크기

 

#innodb_buffer_ll

#https://blog.marceloaltmann.com/en-warm-up-innodb-buffer-pool-pt-esquentando-o-innodb-buffer-pool/

 

innodb_buffer_pool_dump_at_shutdown = 1

innodb_buffer_pool_load_at_startup = 1

innodb_buffer_pool_load_abort=ON

 

#트랜잭션 로그를 기록하는 파일 사이즈이며,32M 128MB ~ 256MB가 적당합니다.

innodb_log_file_size=256M

 

#이중으로 쓰기 버퍼를 사용하는지 여부를 설정하는 변수로 활성화 시 innodb_doublewrite 공간에 기록 후 데이터 저장합니다. 저는 활성화합니다.

# on off에 따라.... http://urin79.com/blog/20660042 오류발생됩니다.

innodb_use_sys_malloc =  0

innodb_flush_method = normal

 

#강제로 InnoDB 복구하기(http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01&m_no=21875&cat1=14&cat2=422&cat3=442&lang=k)

#innodb_force_recovery = 4

 

#innodb_thread_concurrency 값은 0으로 하는것이 효율적/시스템이 가용할수 있는 만큼 최대로 사용한다는 뜻입니다. 

innodb_thread_concurrency=16

 

[myisamchk]

key_buffer_size = 256M

sort_buffer_size = 8M

read_buffer = 8M

write_buffer = 8M

 

 

Created tmp disk tables 디스크 사용량이 많아질 경우 대처방법

 

 

 

 

 

XE튜닝

익스프레스엔진(XE) 사용시 굳이 minify 캐싱을 할 필요가 없다.
(중복되므로 버벅 거리는 현상이 일어남)

 

하지만 RSS 문제로 Gzip을 풀었다면 minify를 반드시 설치해라.

스킨선택이 정말 중요.
스킨에 따라 용량이 줄어듬.

스크립트는 꼭 필요한 경우가 아니면 제일 하단에 넣는다.

특히나 구글 애널리틱스 같은 스크립트들...머 구글광고 같은건 느려도 감안해야죠.

 

하나씩 수정해 나가면서 나의 웹문서가 얼마나 작아졌는지 하나씩 점검해 나가야 합니다.

웹속도측정사이트 : https://gtmetrix.com/reports/urin79.com/KCSlTUO3

 

요약 (내 사이트가 느리다 싶으면)

xetown의 프렌다님 글 

1. 레이아웃 등에서 불러오는 JS파일을 최하단으로 내려라.

(보여져야 할 부분이 미리 보여지고 기능적인 부분은 그 후에 불러오게 됩니다.)

2. 레이아웃 헤더 스크립트에 있는 내용은 직접 레이아웃 최하단에 넣던가, 관리자페이지 시스템 설정의 하단(footer) 스크립트로 이동

3. 웹폰트 등을 사용하고 있다면 가능한 경량화 시키고 혹은 속도가 빠른 CDN으로 물려라

4. 오브젝트 캐시 사용 , 스크립트 자동 압축 등의 기능을 적절히 세팅 (XE의 경우 기진곰 님의 ZipperUpper! 으로 대체)

5. 레이아웃 등에서 실제 사용하지도 않는데 불러오는 *.JS 혹은 스크립트 등은 버려라

 

테스트 홈피에 XE 1.8.19 버전을 설치 후 우연히 RSS FEED CHECK를 했더니 예전에 나오던 오류가 없어졌습니다.

 

 
This is a valid RSS feed.
 
체크해보니 위와 같은 메시지가 나오네요.
 
그래서 나머지 홈피에도 적용했습니다.
 
근데 Gzip 풀려서 deflate, minify 별도로 적용했는데 중복 압축은 시스템을 더 느리게 하는 요인이 되지 않을지,,,
 
 

XE <title>제목 - 사이트명</title> 으로 변경방법

 

 

 

이게 제일 확실하다?

/html/xe/modules/board/board.view.php

173번째 줄의  Context::addBrowserTitle($oDocument->getTitleText());

이렇게 수정해 보세요 Context::setBrowserTitle($oDocument->getTitleText());

 
 

XE 반응형 모바일 메타태그 삽입하기

 

xe설치주소\common\tpl\common_layout.html

 

<!DOCTYPE html>

<html lang="{str_replace('jp','ja',$lang_type)}">

<head>

<!-- META -->

<meta charset="utf-8">

<meta name="Generator" content="XpressEngine">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width,minimum-scale=1.0" />

<block loop="Context::getMetaTag() => $no, $val">

<meta http-equiv="{$val['name']}"|cond="$val['is_http_equiv']" name="{$val['name']}"|cond="!$val['is_http_equiv']" content="{$val['content']}">

</block>

<!-- TITLE -->

 

해당주소의 파일을 찾아 붉은색라인을 붙여넣으면 끝!

참 쉽죠잉.

 

 

memcached + XE슈퍼캐시모듈로 엄청난 속도 개선하기

http://code.jellycan.com/files/memcached-1.2.5-win32-bin.zip
http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip
http://downloads.northscale.com/memcached-win32-1.4.4-14.zip
http://downloads.northscale.com/memcached-win64-1.4.4-14.zip
http://downloads.northscale.com/memcached-1.4.5-x86.zip
http://downloads.northscale.com/memcached-1.4.5-amd64.zip

 

In versions earlier than 1.4.5, memcached can install itself as a service. However, the ability to run memcached as a service is removed since version 1.4.5. Therefore, the installation steps are divided into two categories, part A for memcached prior to version 1.4.5. and part B for memcached version 1.4.5 and later.

A) Installation of memcached < 1.4.5:

  1. Extract the memcached windows binary to any directory.
  2. In versions earlier than 1.4.5, memcached can install itself as a service. Run a command prompt with elevated privileges, and type:
    c:\memcached\memcached.exe -d install

    * Replace c:\memcached\memcached.exe with the actual path of your installation.

  3. Then, start or stop the memcached service with the following command:
    c:\memcached\memcached.exe -d start
    c:\memcached\memcached.exe -d stop
  4. To change the configuration of memcached, run regedit.exe and navigate to the key "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached". Suppose you wish to increase the memory limit of memcached, edit the value of ImagePath to the following:
    "c:\memcached\memcached.exe" -d runservice -m 512

    * Besides '-m 512', you may also append other memcached parameters to the path. Run "c:\memcached\memcached.exe -h" to view the list of available parameters.

  5. Meanwhile, to uninstall the memcached serivce, run the following command:
    c:\memcached\memcached.exe -d uninstall

B) Installation of memcached >= 1.4.5:

  1. Extract the memcached windows binary to any directory.
  2. In version 1.4.5 or later, memcached cannot run as a service. It must be started as a normal process using the task scheduler. To configure the memcached process to run automatically every time windows start, run a command prompt with elevated privileges, and type the following:
    schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"

    * Replace c:\memcached\memcached.exe with the actual path of your installation.
    ** Besides '-m 512', you may also append other memcached parameters to the path. Run "c:\memcached\memcached.exe -h" to view the list of available parameters.

  3. Meanwhile, to remove the scheduled memcached task, run the following command:
    schtasks /delete /tn memcached

 

Integrating with PHP

To interface with memcached in PHP, you need to install the memcache extension for PHP:

  1. Check that your PHP extension folder has the file php_memcache.dll. If not, download the file from https://pecl.php.net/package/memcache (select the windows dll file), and place it in the PHP extension folder.
  2. Add the following line in php.ini to enable the memcache extension.
    extension=php_memcache.dll
  3. Create this simple php script file to test that it works.
    <?php
    
    $memcache = new Memcache;
    $memcache->connect('localhost', 11211) or die ("Could not connect");
    
    $version = $memcache->getVersion();
    echo "Server's version: ".$version."<br/>\n";
    
    $tmp_object = new stdClass;
    $tmp_object->str_attr = 'test';
    $tmp_object->int_attr = 123;
    
    $memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
    echo "Store data in the cache (data will expire in 10 seconds)<br/>\n";
    
    $get_result = $memcache->get('key');
    echo "Data from the cache:<br/>\n";
    
    var_dump($get_result);
    
    ?> 

Integrating with Python

To interface with memcached in Python, you need to install the memcached client for Python.

  1. Execute one of the following command to install the memcached client. The first is for Python 2.x while the second is for Python 3.x.
    pip install python-memcached
    pip install python3-memcached
  2. Create this simple python script to test that it works.
    import memcache
    mc = memcache.Client(['127.0.0.1:11211'], debug=0)
    mc.set("some_key", "Some value")
    value = mc.get("some_key")
    mc.set("another_key", 3)
    mc.delete("another_key")
    mc.set("key", "1")   # note that the key used for incr/decr must be a string.
    mc.incr("key")
    mc.decr("key")

Memcached statistics

To view the statistics for memcached, bring up a telnet connection to memcached by the command:

telnet 127.0.0.1 11211

Then, type stats and enter.

Here is an explanation of the different memcached stats.

 

 
로그인 후 댓글쓰기가 가능합니다.

?
  • ?
    Progress 2016.03.19 07:51
    XE 조언
    https://www.xpressengine.com/tip/23132669
  • ?
    Progress 2016.03.24 11:59
    http://2cpu.co.kr/bbs/board.php?bo_table=PDS&wr_id=9750

    Mysql 튜닝조언
  • ?
    Progress 2016.03.28 11:21
    아파치 최적화
    http://m.blog.naver.com/kmk1030/150141633528

List of Articles
번호 분류 제목 날짜 조회 수
477 WindowsTip 삼성노트북 NT300E5C-A15R 드라이버 2012.11.27 8812
476 AutoHotKey autohotkey) 파일리스트 가져오기 3 2012.11.26 14973
475 컴퓨터잡담 Ateros(아테로스) AR9485WB-EG 무선 네트워크 어댑터 드라이버 업데이트 및 다운로드 4 file 2012.11.25 15762
474 컴퓨터잡담 실시간 메모리 최적화 [Cleanmem] 11 file 2012.11.23 8017
473 WindowsTip 가상메모리 클리어로 빠른 부팅하기 12 file 2012.11.23 14946
472 AutoHotKey AHK) 보안프로그램 등으로 화면복사(Printscreen) 안될때 사용방법 1 12 file 2012.11.21 47162
471 컴퓨터잡담 XE) blogapi 기능 특이증상 해결방법 2012.11.21 4935
470 컴퓨터잡담 blogapi 기능을 사용하여 xe 게시판으로 글쓰기 2012.11.20 7171
469 컴퓨터잡담 XE 모바일에서 글쓰기 안되는 증상 해결방법 file 2012.11.10 4950
468 컴퓨터잡담 [Windows - 지연된 쓰기 실패] 오류메시지 복구방법 2012.11.07 8775
467 컴퓨터잡담 공유기가 자꾸 다운되는 현상에 대한 여러가지 해결방법 2 2012.11.05 5036
466 컴퓨터잡담 공룡 색칠공부 file 2012.10.29 4492
465 컴퓨터잡담 차단된 사이트 프록시서버로 우회하는 방법 3 2012.10.24 10765
464 컴퓨터잡담 ARP(mac spoofing) 바이러스 내용 스크랩 3 file 2012.10.19 6438
463 컴퓨터잡담 TCP View로 네트워크 트래픽 유발 프로그램 찾아내기 file 2012.10.18 6062
462 컴퓨터잡담 Wireshark 이용하여 tcp/ip 패킷내용 추출하기 2 6 2012.10.18 8147
461 컴퓨터잡담 프린터 내용 파일로 저장하기 doPDF 2012.10.17 4706
460 컴퓨터잡담 구글 플레이스토어 file 2012.10.16 3940
459 컴퓨터잡담 GfxUI.exe 오류 발생시 긴급조치 / 화면깨짐현상 등 2 file 2012.10.16 14425
458 컴퓨터잡담 도스모드 ftp에서 하위폴더까지 모두 ftp로 전송하기 18 2012.10.04 18784
Board Pagination Prev 1 ... 21 22 23 24 25 ... 46 Next
/ 46

http://urin79.com

우린친구블로그

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소