달력

9

« 2019/9 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  
  •  
  •  
  •  
  •  

먼저 데이터가 일관되지 않게 처리되는 상황을 확인해보면 아래와 같습니다.

 

낮은 단계의 트랜잭션 격리 수준에서 발생하는 현상

Dirty Read

다른 트랜잭션에서 처리 중인 내용이 완료되지 않았음에도, 트랜잭션에서 볼 수 있게되는 현상.
트랜잭션1 에서 A 테이블을 SELECT 한 후, 트랜잭션2 에서 A 테이블 내용을 변경하는 상황 가정.
트랜잭션2 가 해당 변경사항을 commit 하지도 않았는데, 트랜잭션1 에서 다시 A 테이블을 SELECT 하면 해당 변경사항을 읽어들일 수 있게 됩니다.



Non-Repeatable Read (Inconsistent Read)

트랜잭션 시작 후, 반복적인 조회작업에서 다른 트랜잭션에서 데이터가 변경되는 경우, 조회 시 데이터가 일치하지 않는 문제가 발생하는 현상.
트랜잭션1 에서 A 테이블을 SELECT 한 후, 트랜잭션2 에서 A 테이블 내용을 변경(UPDATE)하는 상황 가정.
트랜잭션2 가 해당 변경사항(UPDATE)을 commit 한 이후에, 트랜잭션1에서 다시 A 테이블을 SELECT 하면 해당 변경사항을 읽어들일 수 있게 됩니다.


Phantom Read

한 트랜잭션에서 일정 범위 내의 레코드를 두 번 이상 읽을 때, 첫번째 쿼리 조회 결과에서 없던 레코드가 조회되는 현상.
트랜잭션1 이 A 테이블에서 SELECT 한 이후, 트랜잭션2 에서 A 테이블에 내용을 추가/삭제(INSERT/UPDATE)하는 상황 가정.
Repeatable Read 가 보장된 경우, A 테이블에서 SELECT 해왔던 데이터들을 다른 트랜잭션2 가 수정(UPDATE)하여 commit한 후, 트랜잭션1 에서 다시 A 테이블을 SELECT 하더라도 트랜잭션2 의 수정내용을 읽어들일 수 없습니다.
하지만 트랜잭션2 가 추가/삭제(INSERT/DELETE)를 한 경우, 다시 A 테이블에서 SELECT 하게되면 기존에 A 테이블에서 SELECT 했던 데이터에서 row 가 추가되거나 사라질 수 있습니다. (유령 데이터) 

-------------------------------------------------------------------------------------------------------------

트랜잭션 격리 수준 / 잠금 레벨 / locking level

Read Uncommitted (level 0)

커밋되지 않은 읽기, 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용.
A 라는 데이터를 B 라는 데이터로 변경하는 동안, 다른 사용자는 B 라는 (커밋 되지않은) 데이터를 읽을 수 있습니다.
Dirty Read, Non-Repeatable Read, Phantom Read 가 발생할 확률이 높습니다.


Read committed (level 1)

커밋된 읽기, 커밋되어 확정된 데이터를 다른 트랜잭션에서 읽는 것을 허용. : dirty read 방지.
A 라는 데이터를 B 라는 데이터로 변경하는 동안, 다른 사용자는 해당 데이터에 접근할 수 없습니다.
Non-Repeatable Read, Phantom Read 가 발생할 확률이 높습니다.


Repeatable Read (level 2) - MySQL InnoDB의 디폴트 격리수준

반복 읽기, 트랜잭션 내에서 한번 조회한 데이터가 반복적으로 조회 됩니다.
A 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 B 트랜잭션이 갱신하거나 삭제하는 것을 허용하지 않음으로써 같은 데이터를 두 번 쿼리했을 때 일관성 있는 결과를 리턴 합니다.
SELECT col FROM a WHERE col1 BETWEEN 1 AND 10 
을 수행하였고 결과는 두 건의 데이터 출력(col1 = 1 ,5). 
다른 사용자가 col1 이 1 이나 5 인 row 에 대한 update 는 불가능합니다. 이를 제외한 나머지 범위에 해당하는 row 를 insert 하는 것은 가능. 
Phantom Read 가 발생할 확률이 높습니다.


Serializable (level 3)

트랜잭션이 완료될 때까지 SELECT 문장에 사용하는 모든 데이터는 shared lock 이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능 합니다.
Dirty Read, Non-Repeatable Read, Phantom Read가 발생할 확률이 낮지만 동시 처리 성능은 크게 떨어질 수 있습니다.

 

MySQL InnoDB 의 디폴트 격리수준은 Repeatable Read 입니다. 
격리수준 변경은 SET tx_isolation='격리수준이름' 으로 바꿀 수 있습니다.

 

Posted by 멋지다마라송

MySQL - with(nolock) 같은 힌트 : isolation level 변경하기.

 

MySQL 에서는 MSSQL 에서 자주 사용하는 with(nolock) 같은 힌트를 사용할 수 없습니다.

비슷한 형태로 쿼리를 실행하려면 isolation level 을 변경하면 됩니다.



set session transaction isolation level read uncommitted ;

select * from table ;

set session transaction isolation level repeatable read ;

 

Posted by 멋지다마라송
2019.06.03 20:13

MySQL - 원격접속 안될때 Tech/MySQL2019.06.03 20:13

방화벽도 열었는데 원격 접속이 안될때.

 

my.cnf 에 바인딩되는 아이피를 확인해봅니다.

...
port = 3306
bind-address = 127.0.0.1
...


이렇게 되어있으면 로컬에서밖에 접속이 안됩니다.

 

모든 아이피에서 허용하려면

...
port = 3306
#bind-address = 127.0.0.1
...

이렇게 127.0.0.1 부분을 주석처리하고 재기동하면 됩니다.

 

 

Posted by 멋지다마라송
2019.04.18 08:54

Linux, nginx, PHP-FPM, MySQL 최적화 분류없음2019.04.18 08:54

Configuring Your LEMP System (Linux, nginx, MySQL, PHP-FPM) For Maximum Performance
Version 1.0 
Author: Falko Timme 
 Follow me on Twitter

If you are using nginx as your webserver, you are looking for a performance boost and better speed. nginx is fast by default, but you can optimize its performance and the performance of all parts (like PHP and MySQL) that work together with nginx. Here is a small, incomprehensive list of tips and tricks to configure your LEMP system (Linux, nginx, MySQL, PHP-FPM) for maximum performance. These tricks work for me, but your mileage may vary. Do not implement them all at once, but one by one and check what effect the modification has on your system's performance.

 
 
1 Reducing Disk I/O By Mounting PArtitions With noatime And nodiratime
Add noatime and nodiratime to your mount options in /etc/fstab:

vi /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#                
proc            /proc           proc    defaults        0       0
# / was on /dev/sda2 during installation
UUID=9cc886cd-98f3-435a-9830-46b316e2a20e /               ext3    errors=remount-ro,noatime,nodiratime,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0 0       1
# swap was on /dev/sda1 during installation
UUID=bba13162-121d-40a4-90a7-10f78a0097ae none            swap    sw              0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto     0       0

#Parallels Shared Folder mount
none         /media/psf   prl_fs   sync,nosuid,nodev,noatime,share,nofail     0       0
Remount the modified partitions as follows (make sure you use the correct mount point for each partition):

mount -o remount /
You can read more about this in this howto: Reducing Disk IO By Mounting Partitions With noatime

 

2 Tuning nginx
2.1 worker_processes
Make sure you use the correct amount of worker_processes in your /etc/nginx/nginx.conf. This should be equal to the amount of CPU cores in the output of

cat /proc/cpuinfo | grep processor
root@server1:~# cat /proc/cpuinfo | grep processor
 processor : 0
 processor : 1
 processor : 2
 processor : 3
 processor : 4
 processor : 5
 processor : 6
 processor : 7
 root@server1:~#
In this example, we have eight CPU cores, so we set

vi /etc/nginx/nginx.conf
[...]
worker_processes 8;
[...]
 

2.2 keepalive_timeout, sendfile, tcp_nopush, tcp_nodelay
Set keepalive_timeout to a sensible value like two seconds. Enable sendfile, tcp_nopush, and tcp_nodelay:

vi /etc/nginx/nginx.conf
[...]
http {
[...]
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 2;
        types_hash_max_size 2048;
        server_tokens off;
[...]
}
[...]
 

2.3 File Cache
Enable the nginx file cache:

vi /etc/nginx/nginx.conf
[...]
http {
[...]
        ##
        # File Cache Settings
        ##

        open_file_cache          max=5000  inactive=20s;
        open_file_cache_valid    30s;
        open_file_cache_min_uses 2;
        open_file_cache_errors   on;
[...]
}
[...]
 

2.4 Enable Gzip Compression
You can read more about Gzip compression here: How To Save Traffic With nginx's HttpGzipModule (Debian Squeeze)

vi /etc/nginx/nginx.conf
[...]
http {
[...]
        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_static on;
        gzip_disable "msie6";
        gzip_http_version 1.1;
        gzip_vary on;
        gzip_comp_level 6;
        gzip_proxied any;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js;
        gzip_buffers 16 8k;
[...]
}
[...]
 

2.5 Enable The SSL Session Cache
If you serve https web sites, you should enable the SSL session cache:

vi /etc/nginx/nginx.conf
[...]
http {
[...]
        ssl_session_cache    shared:SSL:10m;
        ssl_session_timeout  10m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
[...]
}
[...]
 

2.6 Use The FastCGI Cache
If you have cacheable PHP content, you can use the nginx FastCGI cache to cache that content. In your nginx.conf, add a line similar to this one:

vi /etc/nginx/nginx.conf
[...]
http {
[...]
        fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=microcache:10m max_size=1000m inactive=60m;
[...]
}
[...]
The cache directory /var/cache/nginx must exist and be writable for nginx:

mkdir /var/cache/nginx
 chown www-data:www-data /var/cache/nginx
 

(By using tmpfs, you can even place the directory directly in your server's memory which provides another small speed advantage - take a look at this tutorial to learn more: Storing Files/Directories In Memory With tmpfs).

In your vhost configuration, add the following block to your location ~ \.php$ {} section (you can modify it depending on when content should be cached and when not):

[...]
                # Setup var defaults
                set $no_cache "";
                # If non GET/HEAD, don't cache & mark user as uncacheable for 1 second via cookie
                if ($request_method !~ ^(GET|HEAD)$) {
                    set $no_cache "1";
                }
                # Drop no cache cookie if need be
                # (for some reason, add_header fails if included in prior if-block)
                if ($no_cache = "1") {
                    add_header Set-Cookie "_mcnc=1; Max-Age=2; Path=/";
                    add_header X-Microcachable "0";
                }
                # Bypass cache if no-cache cookie is set
                if ($http_cookie ~* "_mcnc") {
                            set $no_cache "1";
                }
                # Bypass cache if flag is set
                fastcgi_no_cache $no_cache;
                fastcgi_cache_bypass $no_cache;
                fastcgi_cache microcache;
                fastcgi_cache_key $scheme$host$request_uri$request_method;
                fastcgi_cache_valid 200 301 302 10m;
                fastcgi_cache_use_stale updating error timeout invalid_header http_500;
                fastcgi_pass_header Set-Cookie;
                fastcgi_pass_header Cookie;
                fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
[...]
 

So the full location ~ \.php$ {} section could look as follows:

[...]
location ~ \.php$ {

                # Setup var defaults
                set $no_cache "";
                # If non GET/HEAD, don't cache & mark user as uncacheable for 1 second via cookie
                if ($request_method !~ ^(GET|HEAD)$) {
                    set $no_cache "1";
                }
                # Drop no cache cookie if need be
                # (for some reason, add_header fails if included in prior if-block)
                if ($no_cache = "1") {
                    add_header Set-Cookie "_mcnc=1; Max-Age=2; Path=/";
                    add_header X-Microcachable "0";
                }
                # Bypass cache if no-cache cookie is set
                if ($http_cookie ~* "_mcnc") {
                            set $no_cache "1";
                }
                # Bypass cache if flag is set
                fastcgi_no_cache $no_cache;
                fastcgi_cache_bypass $no_cache;
                fastcgi_cache microcache;
                fastcgi_cache_key $scheme$host$request_uri$request_method;
                fastcgi_cache_valid 200 301 302 10m;
                fastcgi_cache_use_stale updating error timeout invalid_header http_500;
                fastcgi_pass_header Set-Cookie;
                fastcgi_pass_header Cookie;
                fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass unix:/var/lib/php5-fpm/web1.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_script_name;
                fastcgi_intercept_errors on;
}
[...]
This would cache pages with the return codes 200, 301, and 302 for ten minutes.

You can read more about this topic here: Why You Should Always Use Nginx With Microcaching

 

2.7 Use FastCGI Buffers
In your vhost configuration, you can add the following lines to your location ~ \.php$ {} section:

[...]
                fastcgi_buffer_size 128k;
                fastcgi_buffers 256 16k;
                fastcgi_busy_buffers_size 256k;
                fastcgi_temp_file_write_size 256k;
                fastcgi_read_timeout 240;
[...]
 

The full location ~ \.php$ {} section could look as follows:

[...]
location ~ \.php$ {
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass unix:/var/lib/php5-fpm/web1.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_script_name;
                fastcgi_intercept_errors on;

                fastcgi_buffer_size 128k;
                fastcgi_buffers 256 16k;
                fastcgi_busy_buffers_size 256k;
                fastcgi_temp_file_write_size 256k;
                fastcgi_read_timeout 240;
}
[...]
 

2.8 Use memcached
nginx can read full pages directly from memcached. So if your web application is capable of storing full pages in memcached, nginx can fetch that page from memcached. An example configuration (in your vhost) would be as follows:

[...]
        location ~ \.php$ {
                set $no_cache "";
                if ($query_string ~ ".+") {
                        set $no_cache "1";
                }
                if ($request_method !~ ^(GET|HEAD)$ ) {
                        set $no_cache "1";
                }
                if ($request_uri ~ "nocache") {
                        set $no_cache "1";
                }
                if ($no_cache = "1") {
                        return 405;
                }

                set $memcached_key $host$request_uri;
                memcached_pass     127.0.0.1:11211;
                default_type text/html;
                error_page 404 405 502 = @php;
                expires epoch;
        }

        location @php {
                        try_files $uri =404;
                        include /etc/nginx/fastcgi_params;
                        fastcgi_pass unix:/var/lib/php5-fpm/web1.sock;
                        fastcgi_index index.php;
                        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                        fastcgi_param PATH_INFO $fastcgi_script_name;
                        fastcgi_intercept_errors on;
        }
[...]
It is important that your web application uses the same key for storing pages in memcached that nginx uses to fetch these pages from memcached (in this example it's $host$request_uri), otherwise this will not work.

If you store lots of data in memcached, make sure you have allocated enough RAM to memcached, e.g.:

vi /etc/memcached.conf
[...]
# Start with a cap of 64 megs of memory. It's reasonable, and the daemon default
# Note that the daemon will grow to this size, but does not start out holding this much
# memory
-m 512
[...]
 

2.9 Make Browsers Cache Static Files With The expires Directive
Files (like images, CSS, JS, etc.) that don't change often can be cached by the visitor's browser by using the expires directive (see http://wiki.nginx.org/HttpHeadersModule#expires):

[...]
               location ~*  \.(jpg|jpeg|png|gif|ico)$ {
                         expires 365d;
               }
[...]
 

2.10 Disable Logging For Static Files
Normally it doesn't make much sense to log images or CSS files in the access log. To reduce disk I/O, we can disable logging for such files, e.g. as follows:

[...]
               location ~*  \.(jpg|jpeg|png|gif|ico)$ {
                         log_not_found off;
                         access_log off;
               }
[...]
 

3 Tuning PHP-FPM
3.1 Use A PHP Opcode Cache Like Xcache Or APC
Make sure you have a PHP opcode cache such as Xcache or APC installed. On Debian/Ubuntu, Xcache can be installed as follows:

apt-get install php5-xcache
APC can be installed as follows:

apt-get install php-apc
Make sure you have just one installed (either Xcache or APC), not both. Reload PHP-FPM after the installation:

/etc/init.d/php5-fpm reload
 

3.2 Allocate Enough Memory To Xcache/APC
If you have lots of PHP scripts, you should probably raise the memory that is allocated to Xcache or APC. For Xcache, you can do this in /etc/php5/conf.d/xcache.ini:

vi /etc/php5/conf.d/xcache.ini
[...]
xcache.size  =                512M
[...]
Likewise for APC:

vi /etc/php5/conf.d/apc.ini
[...]
apc.shm_size="512"
[...]
Reload PHP-FPM after your modification:

/etc/init.d/php5-fpm reload
 

3.3 PHP-FPM Emergency Settings
This is more of a reliability setting than a performance setting: PHP-FPM can restart itself if it stops working:

vi /etc/php5/fpm/php-fpm.conf
[...]
; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
emergency_restart_threshold = 10

; Interval of time used by emergency_restart_interval to determine when
; a graceful restart will be initiated.  This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
emergency_restart_interval = 1m

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
process_control_timeout = 10s
[...]
 

3.4 For PHP >= 5.3.9: Use The ondemand Process Manager
If you use PHP >= 5.3.9, you can use the ondemand process manager in a PHP-FPM pool instead of static or dynamic, this will save you some RAM:

[...]
pm = ondemand
pm.max_children = 100
pm.process_idle_timeout = 5s
[...]
 

3.5 Use Unix Sockets Instead Of TCP Sockets
To reduce networking overhead, you should configure your pools to use Unix sockets instead of TCP:

[...]
;listen = 127.0.0.1:9000
listen = /var/lib/php5-fpm/www.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
[...]
If you change this, you must of course adjust the location ~ \.php$ {} section in your nginx vhost to use the socket (fastcgi_pass unix:/var/lib/php5-fpm/www.sock; instead of fastcgi_pass 127.0.0.1:9000;):

[...]
location ~ \.php$ {
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                ##fastcgi_pass 127.0.0.1:9000;
                fastcgi_pass unix:/var/lib/php5-fpm/www.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_script_name;
                fastcgi_intercept_errors on;
}
[...]
 

3.6 Avoid 502 Bad Gateway Errors With Sockets On Busy Sites
If you use Unix sockets with PHP-FPM, you might encounter random 502 Bad Gateway errors with busy websites. To avoid this, we raise the max. number of allowed connections to a socket. Open /etc/sysctl.conf...

vi /etc/sysctl.conf
... and set:

[...]
net.core.somaxconn = 4096
[...]
Run

sysctl -p
afterwards for the change to take effect.

 

4 Tuning MySQL
4.1 Optimize Your my.cnf
You should use scripts such as mysqltuner.pl or tuning-primer.sh (or both) to find out which settings you should adjust in your my.cnf file. One of the most important variables is query_cache_size, and, if you use InnoDB tables, innodb_buffer_pool_size.

This is an example configuration from a test server with 16GB RAM, about 30 databases with 50% MyISAM tables and 50% InnoDB tables - this worked out quite well for database-driven test sites that were stressed with a benchmark tool (ab):

[...]
key_buffer = 256M

max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 100

table_open_cache = 16384
table_definition_cache = 8192

sort_buffer_size = 256K

read_buffer_size = 128K

read_rnd_buffer_size = 256K

myisam_sort_buffer_size = 64M
myisam_use_mmap = 1
thread_concurrency = 10
wait_timeout = 30

myisam-recover = BACKUP,FORCE

query_cache_limit = 10M
query_cache_size = 1024M
query_cache_type = 1

join_buffer_size = 4M

log_slow_queries        = /var/log/mysql/mysql-slow.log
long_query_time = 1

expire_logs_days        = 10
max_binlog_size         = 100M

innodb_buffer_pool_size = 2048M
innodb_log_file_size = 256M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 0
innodb_thread_concurrency = 8
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 50000
innodb_flush_method = O_DIRECT
innodb_file_per_table
innodb_additional_mem_pool_size = 256M
transaction-isolation = READ-COMMITTED

innodb_support_xa = 0
innodb_commit_concurrency = 8
innodb_old_blocks_time = 1000
[...]
Please note: If you need ACID compliance, you must set innodb_flush_log_at_trx_commit to 1. You can find out more about this on http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit.

innodb_io_capacity should be set to high values only if you use MySQL on an SSD. If you use it on a normal hard drive, you better leave that line out.

 

4.2 Use An SSD
You can get a big performance boost by using MySQL with a solid state disk (SSD) as this reduces disk I/O a lot. The easiest way to do this is by mounting the /var/lib/mysql directory to an SSD.

 

5 Web Application Caching
Lots of web applications (such as WordPress with the WP Super Cache or W3 Total Cache plugins, Drupal with the Boost module, TYPO3 with the nc_staticfilecache extension) offer the possibility to create a full page cache which is stored on the hard drive and which can be accessed directly by nginx so that it can bypass the whole PHP-MySQL stack. This provides a huge performance boost.

You can find tutorials about this here:

Running WordPress On Nginx (LEMP) On Debian Squeeze/Ubuntu 11.04
Running Drupal 7.7 On Nginx (LEMP) On Debian Squeeze/Ubuntu 11.04
Running TYPO3 4.6 On Nginx (LEMP) On Debian Squeeze/Ubuntu 11.10
You can speed the static file cache up even more by placing it directly in the server's memory with the tmpfs filesystem:

Storing Files/Directories In Memory With tmpfs

Of course, you can use tmpfs also for the nginx FastCGI cache from chapter 2.6.

 

6 Links
nginx Wiki: http://wiki.nginx.org/Main
PHP: http://www.php.net/
PHP-FPM: http://php-fpm.org/
MySQL: http://www.mysql.com/

Posted by 멋지다마라송

$ ulimit -a

...

open files                      (-n) 1024 <-- 기본값.

...


mysql> show global variables like '%open%';

+----------------------------+----------+

| Variable_name              | Value    |

+----------------------------+----------+

| have_openssl               | DISABLED |

| innodb_open_files          | 2000     |

| open_files_limit           | 1024     | <-- 기본값.

| table_open_cache           | 2000     |

| table_open_cache_instances | 16       |

+----------------------------+----------+

-------------------------------------------------------------------

vi /etc/profile 아래 세줄 추가.


#ulimit setting

ulimit -u 65535  # max number of process 수정

ulimit -n 65535  # open files 값 수정

-------------------------------------------------------------------

vi /etc/security/limits.conf 아래 여섯줄 추가.


*               soft    nofile          65535

*               hard    nofile          65535

root            soft    nofile          65535

root            hard    nofile          65535

mysql           soft    nofile          65535

mysql           hard    nofile          65535

-------------------------------------------------------------------

vi /lib/systemd/system/mysql.service 에서 [Service] 항목에 아래 두줄 추가.


LimitNOFILE=infinity

LimitMEMLOCK=infinity

-------------------------------------------------------------------

systemctl daemon-reload

우분투 재기동.

-------------------------------------------------------------------

mysql> show global variables like '%open%';

+----------------------------+----------+

| Variable_name              | Value    |

+----------------------------+----------+

| have_openssl               | DISABLED |

| innodb_open_files          | 2000     |

| open_files_limit           | 1048576  | <--

| table_open_cache           | 2000     |

| table_open_cache_instances | 16       |

+----------------------------+----------+


참고로, 디비 접속시 접속하는 서버의 DNS lookup 을 생략해주는게 당연히 좋습니다.

vi /etc/mysql/mysql.conf.d/mysqld.cnf


[mysqld]

skip-name-resolve



Posted by 멋지다마라송