Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Redmineチューニングの実際と限界 - Redmine performance tuning

Redmineチューニングの実際と限界 - Redmine performance tuning

More Decks by Kuniharu, AKAHANE (赤羽根/州晴)

Other Decks in Technology

Transcript

  1. 39 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 •

    • • • • https://images-na.ssl-images-amazon.com/images/I/51yBVTM6orL._SX390_BO1,204,203,200_.jpg
  2. 48 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 Server

    Unicorn RAID OS FS NW Ruby Rails Redmine DBMS HTTP Proxy Client Browser JavaScript / DOM OS FS NW Passenger
  3. 49 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 Server

    Unicorn RAID OS FS NW Ruby Rails Redmine DBMS HTTP Proxy Client Browser JavaScript / DOM OS FS NW Passenger Cache Cache Cache Cache Cache Cache Cache Cache Cache Cache Cache Cache Cache
  4. 72 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 •

    株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日
  5. 10万 20万 30万 50万 70万 100万 150万 200万 105 株式会社島津製作所

    分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日
  6. 10万 20万 30万 50万 70万 100万 150万 200万 106 株式会社島津製作所

    分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日
  7. 126 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 •

    株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 Memory 16GB CPU 4cores SSD/HDD NIC
  8. 127 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 1181.8

    1337.1 1534.2 1904.0 2283.7 2864.4 3852.1 4732.5 279.7 477.3 674.0 1034.8 1425.0 1970.3 2966.9 3778.9 273.9 472.5 672.2 1044.9 1426.9 2002.0 3022.8 3828.8
  9. 139 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 2

    million tickets include approximately 1.5 billion multi-byte characters. Indexed FTS takes 1.9s (Avg per 1 search).
  10. • • • • • • • 153 株式会社島津製作所 分析計測事業部

    技術部 - 第26回 Redmine.Tokyo - 2024年6月15日
  11. • • • • • • • • • •

    154 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日
  12. 174 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 mkdir

    /var/lib/its/rm51_its # cd /var/lib/its/rm51_its # git clone https://github.com/redmine/redmine.git . # git checkout -b 5.1-stable-local origin/5.1-stable # git pull (差分取り込み実行) 【チューニング要素】 ・H/W: Memory, CPU ・S/W: DBMS, Ruby, WebAppServer
  13. 176 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 【チューニング要素】

    ・H/W: Memory, CPU ・S/W: DBMS, Ruby, WebAppServer http://____.jp/its/ http://____.jp/its_practice/
  14. 193 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 #

    bench.rb # -*- coding: utf-8 -*- rv = ARGV[0] cashmode = ARGV[1] url_list = [ "/#{rv} ", "/#{rv}/projects ", "/#{rv}/projects/sscope ", "/#{rv}/issues?per_page=200 ", "/#{rv}/issues/1 ", "/#{rv}/issues/47548 ", "/#{rv}/issues/51782 ", "/#{rv}/projects/its-issues/wiki " ] puts "--- Environment ---" puts `httpd -version` puts `ruby -v --yjit ; ruby -v --mjit ; ruby -v --rjit` puts `gem list --local passenger` puts `export RAILS_ENV=production; /var/lib/its/#{rv}/script/about` puts `export RAILS_ENV=production; /var/lib/its/#{rv}/bin/about` puts `export RAILS_ENV=production; cd /var/lib/its/#{rv}; bundle list` ti = 5 result = [] url_list.each { |url| rate_avg = 0 ms_avg = 0 puts "--- #{url} ---" ti.times { res = `httperf --hog --server=localhost --port=80 -- uri=#{url} --num-conns 2 --num-calls 10 2> /dev/null | grep 'Request rate:' | awk '{print$3,$5}' | sed -e 's/(//'` num = res.split(' ').map{|s| s.to_f} puts " rate: #{num[0]} req/s #{num[1]} ms/req" rate_avg += num[0] ms_avg += num[1] sleep 0.2 } rate_avg = (rate_avg/ti).round(1) ms_avg = (ms_avg/ti).round(1) result << [rate_avg, ms_avg] puts " AVG: #{rate_avg} req/s #{ms_avg} ms/req" } rate_avg_total = (result.transpose[0].inject(:+)).round(1) ms_avg_total = (result.transpose[1].inject(:+)).round(1) puts "-------------------------" result.size.times { |r| puts "#{r+1} ¥t #{url_list[r]} ¥t #{result[r][0]} ¥t #{result[r][1]}" } puts "#{cashmode} ¥t Total ¥t #{rate_avg_total} ¥t #{ms_avg_total}" puts "-------------------------" result.size.times { |r| puts " AVG Rate: #{result[r][0]} req/s (#{result[r][1]} ms/req)" }
  15. 194 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 Apache2.4

    /etc/httpd/conf.d/defelate.conf <IfModule mod_deflate.c> SetOutputFilter DEFLATE DeflateCompressionLevel 1 DeflateMemLevel 8 # LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate # CustomLog /var/log/httpd/deflate_log deflate <Location /> # MSIE masquerades as Netscape, but it is fine BrowserMatch ¥bMSIE¥s(7|8) !no-gzip !gzip-only-text/html FilterDeclare Compression CONTENT_SET FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'text/html'" FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'text/plain'" FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'text/css'" FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'text/javascript'" FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'text/xml'" FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/xhtml'" FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/xml'" FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/xhtml+xml'" FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/rss+xml'" FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/atom+xml'" FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/javascript'" FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'image/svg-xml'" FilterChain Compression # Don't append Vary heder for specific files SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|t?gz|zip|bz2|sit|rar|lzh|exe)$ dont-vary # Make sure proxies don't deliver the wrong content Header append Vary Accept-Encoding env=!dont-vary </Location> </IfModule> Apache2.2 /etc/httpd/conf.d/defelate.conf <IfModule mod_deflate.c> DeflateCompressionLevel 2 # LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate # CustomLog /var/log/httpd/deflate_log deflate <Location /> # Netscape 4.x has some problems... BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine BrowserMatch bMSIE !no-gzip !gzip-only-text/html FilterDeclare Compression CONTENT_SET FilterProvider Compression DEFLATE resp=Content-Type $text/html FilterProvider Compression DEFLATE resp=Content-Type $text/xml FilterProvider Compression DEFLATE resp=Content-Type $text/css FilterProvider Compression DEFLATE resp=Content-Type $text/plain FilterProvider Compression DEFLATE resp=Content-Type $image/svg+xml FilterProvider Compression DEFLATE resp=Content-Type $application/xhtml+xml FilterProvider Compression DEFLATE resp=Content-Type $application/xml FilterProvider Compression DEFLATE resp=Content-Type $application/rdf+xml FilterProvider Compression DEFLATE resp=Content-Type $application/rss+xml FilterProvider Compression DEFLATE resp=Content-Type $application/atom+xml FilterProvider Compression DEFLATE resp=Content-Type $text/javascript FilterProvider Compression DEFLATE resp=Content-Type $application/javascript FilterProvider Compression DEFLATE resp=Content-Type $application/x-javascript FilterProvider Compression DEFLATE resp=Content-Type $application/x-font-ttf FilterProvider Compression DEFLATE resp=Content-Type $application/x-font-otf FilterProvider Compression DEFLATE resp=Content-Type $font/truetype FilterProvider Compression DEFLATE resp=Content-Type $font/opentype FilterChain Compression # Don't append Vary heder for specific files SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|t?gz|zip|bz2|sit|rar|lzh|exe)$ dont-vary # Make sure proxies don't deliver the wrong content Header append Vary User-Agent env=!dont-vary Header append Vary Accept-Encoding env=!dont-vary </Location> </IfModule>
  16. 195 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 Apache2

    /etc/httpd/conf.d/passenger.conf # Rails environment settings RailsEnv production # Multiple Redmine Envirnoment with Sub-URI RailsBaseURI /its41 RailsBaseURI /its42 RailsBaseURI /its50 RailsBaseURI /its51 RailsBaseURI /its60dev RailsBaseURI /rmc30 # Remove http headers added by Passenger. Header always unset "X-Powered-By" Header always unset "X-Rack-Cache" Header always unset "X-Content-Digest" Header always unset "X-Runtime" # Tuning Parameters for Passenger. PassengerMaxPoolSize 20 PassengerMaxInstancesPerApp 4 PassengerPoolIdleTime 3600 PassengerHighPerformance on PassengerStatThrottleRate 10 RailsSpawnMethod smart RailsAppSpawnerIdleTime 86400 PassengerMaxPreloaderIdleTime 0 # For OOBGC < Experimental > # PassengerSpawnMethod direct
  17. 196 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 <続き>

    default_storage_engine = InnoDB explicit_defaults_for_timestamp = 1 # For SSD innodb_flush_neighbors = 0 #innodb_page_size = 4K innodb_io_capacity = 2000 innodb_io_capacity_max = 6000 innodb_lru_scan_depth = 2000 # MySQL Server System Variables # http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER join_buffer_size = 128M sort_buffer_size = 1M query_cache_type = 1 query_cache_size = 128M query_cache_limit = 6M tmp_table_size = 512M max_heap_table_size = 1G read_rnd_buffer_size = 16M key_buffer_size = 32M max_allowed_packet = 16M read_buffer_size = 1M bulk_insert_buffer_size = 64M max_connections = 100 character-set-server = utf8 skip-external-locking thread_cache_size = max_connections/3 table_open_cache = 4096 table_open_cache_instances = 64 performance_schema = OFF back_log = 50 + (max_connections / 5) expire_logs_days = 7 open_files_limit = 65500 max_prepared_stmt_count = 65528 innodb_print_all_deadlocks = ON MySQL 5.7 my.cnf # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html [mysqld] init-connect = SET NAMES utf8 default_password_lifetime = 0 server-id = 1 # InnoDB Paramaters # http://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html innodb_buffer_pool_dump_at_shutdown = ON innodb_buffer_pool_load_at_startup = ON innodb_buffer_pool_size = 8G innodb_log_file_size = 4G innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_log_files_in_group = 2 innodb_thread_concurrency = 16 innodb_concurrency_tickets = 5000 innodb_old_blocks_time = 1000 innodb_open_files = 300 innodb_stats_on_metadata = 0 innodb_checksum_algorithm = crc32 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_print_all_deadlocks = ON innodb_data_file_path = ibdata1:10M:autoextend innodb_autoextend_increment = 64 innodb_flush_method = O_DIRECT innodb_read_io_threads = 8 innodb_write_io_threads = 8 innodb_buffer_pool_instances = 8 innodb_rollback_segments = 32
  18. 197 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 <続き>

    default_storage_engine = InnoDB explicit_defaults_for_timestamp = 1 # For SSD innodb_flush_neighbors = 0 # MySQL Server System Variables # http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES join_buffer_size = 128M sort_buffer_size = 1M query_cache_type = 1 query_cache_size = 128M query_cache_limit = 6M tmp_table_size = 512M max_heap_table_size = 1G read_rnd_buffer_size = 16M key_buffer_size = 32M max_allowed_packet = 16M read_buffer_size = 1M bulk_insert_buffer_size = 64M max_connections = 100 character-set-server = utf8 skip-external-locking thread_cache_size = max_connections/3 table_open_cache = 4096 table_open_cache_instances = 64 performance_schema = OFF open_files_limit = 65500 max_prepared_stmt_count = 65528 MySQL 5.6 my.cnf # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html [mysqld] init-connect = SET NAMES utf8 # InnoDB Paramaters # http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html innodb_buffer_pool_dump_at_shutdown = ON innodb_buffer_pool_load_at_startup = ON innodb_buffer_pool_size = 8G innodb_log_file_size = 4G innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_log_files_in_group = 2 innodb_thread_concurrency = 16 innodb_concurrency_tickets = 5000 innodb_old_blocks_time = 1000 innodb_open_files = 300 innodb_stats_on_metadata = 0 innodb_checksum_algorithm = crc32 innodb_file_format = Barracuda innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_print_all_deadlocks = ON innodb_data_file_path = ibdata1:10M:autoextend innodb_autoextend_increment = 64 innodb_flush_method = O_DIRECT innodb_read_io_threads = 8 innodb_write_io_threads = 8 innodb_buffer_pool_instances = 8 innodb_rollback_segments = 32 innodb_use_sys_malloc = 1
  19. 198 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 MySQL

    5.6 my.cnf for Bitnami # The MySQL server [mysqld] # set basedir to your installation path basedir=C:/Bitnami/REDMIN~1.0-2/mysql # set datadir to the location of your data directory datadir=C:/Bitnami/REDMIN~1.0-2/mysql/data port=3306 character-set-server=UTF8 collation-server=utf8_general_ci max_allowed_packet=16M bind-address=127.0.0.1 # The default storage engine that will be used when create new tables when default-storage-engine=INNODB #================================================================ # InnoDB Paramaters # http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html innodb_buffer_pool_size = 2G innodb_log_file_size = 512M innodb_thread_concurrency = 8 innodb_additional_mem_pool_size = 16M innodb_buffer_pool_dump_at_shutdown = ON innodb_buffer_pool_load_at_startup = ON # MySQL Server System Variables # http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html join_buffer_size = 128M sort_buffer_size = 1M query_cache_type = 1 query_cache_size = 64M query_cache_limit = 2M tmp_table_size = 64M max_heap_table_size = 64M #================================================================
  20. 201 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 $

    ruby -v --yjit ; ruby -v --mjit ; ruby -v –rjit 実行結果(例示) Ruby 3.1.4 • ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) +YJIT [x86_64-linux] • ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) +MJIT [x86_64-linux] Ruby 3.2.4 • ruby 3.2.4 (2024-04-23 revision af471c0e01) +YJIT [x86_64-linux] • ruby 3.2.4 (2024-04-23 revision af471c0e01) +MJIT [x86_64-linux] Ruby 3.3.1 • ruby 3.3.1 (2024-04-23 revision c56cd86388) +YJIT [x86_64-linux] • ruby 3.3.1 (2024-04-23 revision c56cd86388) +RJIT [x86_64-linux]
  21. 202 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 $

    sudo vi /etc/sysconfig/httpd の末尾行に追記 # Apache2.4 config/initializers/enable_yjit.rb if defined? RubyVM::YJIT.enable Rails.application.config.after_initialize do RubyVM::YJIT.enable end end
  22. 205 株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日 •

    株式会社島津製作所 分析計測事業部 技術部 - 第26回 Redmine.Tokyo - 2024年6月15日