今、Brainuxの基盤側の設定を詰めています。 いくつかの項目を、調整してみました。
・カーネル最適化編 ・カーネルパラメータ設定 ・ZSWAPの有効化 ・X11描画高速化編 ・X11のフレームバッファ設定 ・環境変数によるパフォーマンスチェック
まとめ(高速化結果) ・ZSWAPの採用で、SDへのメモリスワップを抑えることに成功 ・X11のShadowFB を false に設定することで一部アプリのフレームレートが3割程度向上
カーネルパラメータ設定
Brainuxに合わせたLinuxカーネルパラメータを調整してみました。 使い方によって効果は代わりますが、 必要に応じて別途調整してみることをお勧めします。。
設定ファイルの変更
sudo vi sysctl.conf
###############################################
# Brainux ARMv5 最適化 sysctl.conf
# 目的:低RAM・低速CPU・低速I/O環境での体感速度向上
###############################################
########## メモリ最適化 ##########
# swap を極力使わない(フリーズ防止)
# レスポンス向上に有効だが、副作用が発生する可能性もあります。
vm.swappiness = 0
# ファイルキャッシュを積極的に保持(ゲームの画像・音声が速くなる)
vm.vfs_cache_pressure = 50
# 書き込み遅延を減らして I/O フリーズを防ぐ
vm.dirty_ratio = 5
vm.dirty_background_ratio = 2
# dirty 書き込みを早めに開始(SDカードの詰まり防止)
vm.dirty_expire_centisecs = 1000
vm.dirty_writeback_centisecs = 300
########## CPU スケジューラ最適化 ##########
# fork 直後の子プロセスを優先しない(カクつき防止)
kernel.sched_child_runs_first = 0
# インタラクティブ処理を優先(SDLゲームの反応改善)
# Brainuxでは設定不可
#kernel.sched_latency_ns = 6000000
#kernel.sched_min_granularity_ns = 750000
#kernel.sched_wakeup_granularity_ns = 1000000
########## ネットワーク(軽量化) ##########
# TCP バッファを小さくしてメモリ節約
net.ipv4.tcp_rmem = 4096 87380 131072
net.ipv4.tcp_wmem = 4096 65536 131072
# TIME_WAIT を減らして軽量化
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
########## カーネル動作の軽量化 ##########
# カーネルログの出力を抑制(ゲーム中のカクつき防止)
kernel.printk = 3 3 3 3
# カーネルの OOM killer を積極化(フリーズ防止)
vm.oom_kill_allocating_task = 1
vm.panic_on_oom = 0
###############################################
# 以上
###############################################
この設定ファイルの内容での即時反映は、以下のコマンドで可能です。
$ sudo sysctl -p
設定の確認は、以下のようなコマンドで可能です。
#個別のカーネルパラメータの表示 $ sudo sysctl vm.swappiness vm.swappiness = 0
#全カーネルパラメータの表示 $ sudo sysctl -a
実行結果
user@brain:~$ sudo sysctl -a
[sudo] password for user:
dev.scsi.logging_level = 0
dev.tty.ldisc_autoload = 1
fs.aio-max-nr = 65536
fs.aio-nr = 0
fs.dentry-state = 4119 1127 45 0 216 0
fs.epoll.max_user_watches = 45331
fs.file-max = 2147483647
fs.file-nr = 1177 0 2147483647
fs.inode-nr = 4698 289
fs.inode-state = 4698 289 0 0 0 0 0
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192
fs.lease-break-time = 45
fs.leases-enable = 1
fs.mount-max = 100000
fs.nfs.idmap_cache_timeout = 600
fs.nfs.nfs_callback_tcpport = 0
fs.nfs.nfs_congestion_kb = 10816
fs.nfs.nfs_mountpoint_timeout = 500
fs.nfs.nlm_grace_period = 0
fs.nfs.nlm_tcpport = 0
fs.nfs.nlm_timeout = 10
fs.nfs.nlm_udpport = 0
fs.nfs.nsm_local_state = 0
fs.nfs.nsm_use_hostnames = 0
fs.nr_open = 536870908
fs.overflowgid = 65534
fs.overflowuid = 65534
fs.pipe-max-size = 1048576
fs.pipe-user-pages-hard = 0
fs.pipe-user-pages-soft = 16384
fs.protected_fifos = 1
fs.protected_hardlinks = 1
fs.protected_regular = 2
fs.protected_symlinks = 1
fs.suid_dumpable = 0
kernel.arch = armv5tejl
kernel.auto_msgmni = 0
kernel.cad_pid = 1
kernel.cap_last_cap = 40
kernel.core_pattern = core
kernel.core_pipe_limit = 0
kernel.core_uses_pid = 1
kernel.ctrl-alt-del = 0
kernel.dmesg_restrict = 0
kernel.domainname = (none)
kernel.hostname = brain
kernel.keys.gc_delay = 300
kernel.keys.maxbytes = 20000
kernel.keys.maxkeys = 200
kernel.keys.root_maxbytes = 25000000
kernel.keys.root_maxkeys = 1000000
kernel.kptr_restrict = 0
kernel.max_lock_depth = 1024
kernel.max_rcu_stall_to_panic = 0
kernel.modprobe = /sbin/modprobe
kernel.modules_disabled = 0
kernel.msgmax = 8192
kernel.msgmnb = 16384
kernel.msgmni = 32000
kernel.ngroups_max = 65536
kernel.oops_limit = 10000
kernel.osrelease = 6.1.70-ga9f534c7f53e
kernel.ostype = Linux
kernel.overflowgid = 65534
kernel.overflowuid = 65534
kernel.panic = 0
kernel.panic_on_oops = 0
kernel.panic_on_rcu_stall = 0
kernel.panic_on_warn = 0
kernel.panic_print = 0
kernel.perf_cpu_time_max_percent = 25
kernel.perf_event_max_contexts_per_stack = 8
kernel.perf_event_max_sample_rate = 100000
kernel.perf_event_max_stack = 127
kernel.perf_event_mlock_kb = 516
kernel.perf_event_paranoid = 2
kernel.pid_max = 32768
kernel.poweroff_cmd = /sbin/poweroff
kernel.print-fatal-signals = 0
kernel.printk = 7 4 1 7
kernel.printk_delay = 0
kernel.printk_devkmsg = on
kernel.printk_ratelimit = 5
kernel.printk_ratelimit_burst = 10
kernel.pty.max = 4096
kernel.pty.nr = 4
kernel.pty.reserve = 1024
kernel.random.boot_id = c625ee00-916c-473e-8292-740bf8d2600d
kernel.random.entropy_avail = 256
kernel.random.poolsize = 256
kernel.random.urandom_min_reseed_secs = 60
kernel.random.uuid = 87d94d07-823b-41c6-b70f-6eb01012eb60
kernel.random.write_wakeup_threshold = 256
kernel.randomize_va_space = 2
kernel.real-root-dev = 0
kernel.sched_child_runs_first = 0
kernel.sched_deadline_period_max_us = 4194304
kernel.sched_deadline_period_min_us = 100
kernel.sched_rr_timeslice_ms = 100
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000
kernel.seccomp.actions_avail = kill_process kill_thread trap errno user_notif trace log allow
kernel.seccomp.actions_logged = kill_process kill_thread trap errno user_notif trace log
kernel.sem = 32000 1024000000 500 32000
kernel.shm_rmid_forced = 0
kernel.shmall = 4278190079
kernel.shmmax = 4278190079
kernel.shmmni = 4096
kernel.sysctl_writes_strict = 1
kernel.tainted = 0
kernel.task_delayacct = 0
kernel.threads-max = 1799
kernel.usermodehelper.bset = 4294967295 511
kernel.usermodehelper.inheritable = 4294967295 511
kernel.version = #1 PREEMPT Tue Mar 24 17:57:31 UTC 2026
kernel.warn_limit = 0
net.core.busy_poll = 0
net.core.busy_read = 0
net.core.dev_weight = 64
net.core.dev_weight_rx_bias = 1
net.core.dev_weight_tx_bias = 1
net.core.devconf_inherit_init_net = 0
net.core.fb_tunnels_only_for_init_net = 0
net.core.gro_normal_batch = 8
net.core.high_order_alloc_disable = 0
net.core.max_skb_frags = 17
net.core.message_burst = 10
net.core.message_cost = 5
net.core.netdev_budget = 300
net.core.netdev_budget_usecs = 20000
net.core.netdev_max_backlog = 1000
net.core.netdev_rss_key = 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
net.core.netdev_tstamp_prequeue = 1
net.core.netdev_unregister_timeout_secs = 10
net.core.optmem_max = 10240
net.core.rmem_default = 180224
net.core.rmem_max = 180224
net.core.skb_defer_max = 64
net.core.somaxconn = 4096
net.core.tstamp_allow_data = 1
net.core.txrehash = 1
net.core.warnings = 0
net.core.wmem_default = 180224
net.core.wmem_max = 180224
net.ipv4.conf.all.accept_local = 0
net.ipv4.conf.all.accept_redirects = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.arp_accept = 0
net.ipv4.conf.all.arp_announce = 0
net.ipv4.conf.all.arp_evict_nocarrier = 1
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.all.arp_ignore = 0
net.ipv4.conf.all.arp_notify = 0
net.ipv4.conf.all.bc_forwarding = 0
net.ipv4.conf.all.bootp_relay = 0
net.ipv4.conf.all.disable_policy = 0
net.ipv4.conf.all.disable_xfrm = 0
net.ipv4.conf.all.drop_gratuitous_arp = 0
net.ipv4.conf.all.drop_unicast_in_l2_multicast = 0
net.ipv4.conf.all.force_igmp_version = 0
net.ipv4.conf.all.forwarding = 0
net.ipv4.conf.all.igmpv2_unsolicited_report_interval = 10000
net.ipv4.conf.all.igmpv3_unsolicited_report_interval = 1000
net.ipv4.conf.all.ignore_routes_with_linkdown = 0
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.all.mc_forwarding = 0
net.ipv4.conf.all.medium_id = 0
net.ipv4.conf.all.promote_secondaries = 0
net.ipv4.conf.all.proxy_arp = 0
net.ipv4.conf.all.proxy_arp_pvlan = 0
net.ipv4.conf.all.route_localnet = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.secure_redirects = 1
net.ipv4.conf.all.send_redirects = 1
net.ipv4.conf.all.shared_media = 1
net.ipv4.conf.all.src_valid_mark = 0
net.ipv4.conf.all.tag = 0
net.ipv4.conf.default.accept_local = 0
net.ipv4.conf.default.accept_redirects = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.arp_accept = 0
net.ipv4.conf.default.arp_announce = 0
net.ipv4.conf.default.arp_evict_nocarrier = 1
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.default.arp_ignore = 0
net.ipv4.conf.default.arp_notify = 0
net.ipv4.conf.default.bc_forwarding = 0
net.ipv4.conf.default.bootp_relay = 0
net.ipv4.conf.default.disable_policy = 0
net.ipv4.conf.default.disable_xfrm = 0
net.ipv4.conf.default.drop_gratuitous_arp = 0
net.ipv4.conf.default.drop_unicast_in_l2_multicast = 0
net.ipv4.conf.default.force_igmp_version = 0
net.ipv4.conf.default.forwarding = 0
net.ipv4.conf.default.igmpv2_unsolicited_report_interval = 10000
net.ipv4.conf.default.igmpv3_unsolicited_report_interval = 1000
net.ipv4.conf.default.ignore_routes_with_linkdown = 0
net.ipv4.conf.default.log_martians = 0
net.ipv4.conf.default.mc_forwarding = 0
net.ipv4.conf.default.medium_id = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.default.proxy_arp_pvlan = 0
net.ipv4.conf.default.route_localnet = 0
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.default.secure_redirects = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.default.shared_media = 1
net.ipv4.conf.default.src_valid_mark = 0
net.ipv4.conf.default.tag = 0
net.ipv4.conf.enx3495db26e312.accept_local = 0
net.ipv4.conf.enx3495db26e312.accept_redirects = 1
net.ipv4.conf.enx3495db26e312.accept_source_route = 0
net.ipv4.conf.enx3495db26e312.arp_accept = 0
net.ipv4.conf.enx3495db26e312.arp_announce = 0
net.ipv4.conf.enx3495db26e312.arp_evict_nocarrier = 1
net.ipv4.conf.enx3495db26e312.arp_filter = 0
net.ipv4.conf.enx3495db26e312.arp_ignore = 0
net.ipv4.conf.enx3495db26e312.arp_notify = 0
net.ipv4.conf.enx3495db26e312.bc_forwarding = 0
net.ipv4.conf.enx3495db26e312.bootp_relay = 0
net.ipv4.conf.enx3495db26e312.disable_policy = 0
net.ipv4.conf.enx3495db26e312.disable_xfrm = 0
net.ipv4.conf.enx3495db26e312.drop_gratuitous_arp = 0
net.ipv4.conf.enx3495db26e312.drop_unicast_in_l2_multicast = 0
net.ipv4.conf.enx3495db26e312.force_igmp_version = 0
net.ipv4.conf.enx3495db26e312.forwarding = 0
net.ipv4.conf.enx3495db26e312.igmpv2_unsolicited_report_interval = 10000
net.ipv4.conf.enx3495db26e312.igmpv3_unsolicited_report_interval = 1000
net.ipv4.conf.enx3495db26e312.ignore_routes_with_linkdown = 0
net.ipv4.conf.enx3495db26e312.log_martians = 0
net.ipv4.conf.enx3495db26e312.mc_forwarding = 0
net.ipv4.conf.enx3495db26e312.medium_id = 0
net.ipv4.conf.enx3495db26e312.promote_secondaries = 1
net.ipv4.conf.enx3495db26e312.proxy_arp = 0
net.ipv4.conf.enx3495db26e312.proxy_arp_pvlan = 0
net.ipv4.conf.enx3495db26e312.route_localnet = 0
net.ipv4.conf.enx3495db26e312.rp_filter = 2
net.ipv4.conf.enx3495db26e312.secure_redirects = 1
net.ipv4.conf.enx3495db26e312.send_redirects = 1
net.ipv4.conf.enx3495db26e312.shared_media = 1
net.ipv4.conf.enx3495db26e312.src_valid_mark = 0
net.ipv4.conf.enx3495db26e312.tag = 0
net.ipv4.conf.lo.accept_local = 0
net.ipv4.conf.lo.accept_redirects = 1
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.lo.arp_accept = 0
net.ipv4.conf.lo.arp_announce = 0
net.ipv4.conf.lo.arp_evict_nocarrier = 1
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.lo.arp_ignore = 0
net.ipv4.conf.lo.arp_notify = 0
net.ipv4.conf.lo.bc_forwarding = 0
net.ipv4.conf.lo.bootp_relay = 0
net.ipv4.conf.lo.disable_policy = 1
net.ipv4.conf.lo.disable_xfrm = 1
net.ipv4.conf.lo.drop_gratuitous_arp = 0
net.ipv4.conf.lo.drop_unicast_in_l2_multicast = 0
net.ipv4.conf.lo.force_igmp_version = 0
net.ipv4.conf.lo.forwarding = 0
net.ipv4.conf.lo.igmpv2_unsolicited_report_interval = 10000
net.ipv4.conf.lo.igmpv3_unsolicited_report_interval = 1000
net.ipv4.conf.lo.ignore_routes_with_linkdown = 0
net.ipv4.conf.lo.log_martians = 0
net.ipv4.conf.lo.mc_forwarding = 0
net.ipv4.conf.lo.medium_id = 0
net.ipv4.conf.lo.promote_secondaries = 1
net.ipv4.conf.lo.proxy_arp = 0
net.ipv4.conf.lo.proxy_arp_pvlan = 0
net.ipv4.conf.lo.route_localnet = 0
net.ipv4.conf.lo.rp_filter = 2
net.ipv4.conf.lo.secure_redirects = 1
net.ipv4.conf.lo.send_redirects = 1
net.ipv4.conf.lo.shared_media = 1
net.ipv4.conf.lo.src_valid_mark = 0
net.ipv4.conf.lo.tag = 0
net.ipv4.conf.sit0.accept_local = 0
net.ipv4.conf.sit0.accept_redirects = 1
net.ipv4.conf.sit0.accept_source_route = 0
net.ipv4.conf.sit0.arp_accept = 0
net.ipv4.conf.sit0.arp_announce = 0
net.ipv4.conf.sit0.arp_evict_nocarrier = 1
net.ipv4.conf.sit0.arp_filter = 0
net.ipv4.conf.sit0.arp_ignore = 0
net.ipv4.conf.sit0.arp_notify = 0
net.ipv4.conf.sit0.bc_forwarding = 0
net.ipv4.conf.sit0.bootp_relay = 0
net.ipv4.conf.sit0.disable_policy = 0
net.ipv4.conf.sit0.disable_xfrm = 0
net.ipv4.conf.sit0.drop_gratuitous_arp = 0
net.ipv4.conf.sit0.drop_unicast_in_l2_multicast = 0
net.ipv4.conf.sit0.force_igmp_version = 0
net.ipv4.conf.sit0.forwarding = 0
net.ipv4.conf.sit0.igmpv2_unsolicited_report_interval = 10000
net.ipv4.conf.sit0.igmpv3_unsolicited_report_interval = 1000
net.ipv4.conf.sit0.ignore_routes_with_linkdown = 0
net.ipv4.conf.sit0.log_martians = 0
net.ipv4.conf.sit0.mc_forwarding = 0
net.ipv4.conf.sit0.medium_id = 0
net.ipv4.conf.sit0.promote_secondaries = 1
net.ipv4.conf.sit0.proxy_arp = 0
net.ipv4.conf.sit0.proxy_arp_pvlan = 0
net.ipv4.conf.sit0.route_localnet = 0
net.ipv4.conf.sit0.rp_filter = 2
net.ipv4.conf.sit0.secure_redirects = 1
net.ipv4.conf.sit0.send_redirects = 1
net.ipv4.conf.sit0.shared_media = 1
net.ipv4.conf.sit0.src_valid_mark = 0
net.ipv4.conf.sit0.tag = 0
net.ipv4.fib_notify_on_flag_change = 0
net.ipv4.fib_sync_mem = 524288
net.ipv4.fwmark_reflect = 0
net.ipv4.icmp_echo_enable_probe = 0
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_errors_use_inbound_ifaddr = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.icmp_msgs_burst = 50
net.ipv4.icmp_msgs_per_sec = 1000
net.ipv4.icmp_ratelimit = 1000
net.ipv4.icmp_ratemask = 6168
net.ipv4.igmp_link_local_mcast_reports = 1
net.ipv4.igmp_max_memberships = 20
net.ipv4.igmp_max_msf = 10
net.ipv4.inet_peer_maxttl = 600
net.ipv4.inet_peer_minttl = 120
net.ipv4.inet_peer_threshold = 9212
net.ipv4.ip_autobind_reuse = 0
net.ipv4.ip_default_ttl = 64
net.ipv4.ip_dynaddr = 0
net.ipv4.ip_early_demux = 1
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
net.ipv4.ip_local_port_range = 32768 60999
net.ipv4.ip_local_reserved_ports =
net.ipv4.ip_no_pmtu_disc = 0
net.ipv4.ip_nonlocal_bind = 0
net.ipv4.ip_unprivileged_port_start = 1024
net.ipv4.ipfrag_high_thresh = 4194304
net.ipv4.ipfrag_low_thresh = 3145728
net.ipv4.ipfrag_max_dist = 64
net.ipv4.ipfrag_secret_interval = 0
net.ipv4.ipfrag_time = 30
net.ipv4.neigh.default.anycast_delay = 100
net.ipv4.neigh.default.app_solicit = 0
net.ipv4.neigh.default.base_reachable_time_ms = 30000
net.ipv4.neigh.default.delay_first_probe_time = 5
net.ipv4.neigh.default.gc_interval = 30
net.ipv4.neigh.default.gc_stale_time = 60
net.ipv4.neigh.default.gc_thresh1 = 128
net.ipv4.neigh.default.gc_thresh2 = 512
net.ipv4.neigh.default.gc_thresh3 = 1024
net.ipv4.neigh.default.interval_probe_time_ms = 5000
net.ipv4.neigh.default.locktime = 100
net.ipv4.neigh.default.mcast_resolicit = 0
net.ipv4.neigh.default.mcast_solicit = 3
net.ipv4.neigh.default.proxy_delay = 80
net.ipv4.neigh.default.proxy_qlen = 64
net.ipv4.neigh.default.retrans_time_ms = 1000
net.ipv4.neigh.default.ucast_solicit = 3
net.ipv4.neigh.default.unres_qlen = 91
net.ipv4.neigh.default.unres_qlen_bytes = 180224
net.ipv4.neigh.enx3495db26e312.anycast_delay = 100
net.ipv4.neigh.enx3495db26e312.app_solicit = 0
net.ipv4.neigh.enx3495db26e312.base_reachable_time_ms = 30000
net.ipv4.neigh.enx3495db26e312.delay_first_probe_time = 5
net.ipv4.neigh.enx3495db26e312.gc_stale_time = 60
net.ipv4.neigh.enx3495db26e312.interval_probe_time_ms = 5000
net.ipv4.neigh.enx3495db26e312.locktime = 100
net.ipv4.neigh.enx3495db26e312.mcast_resolicit = 0
net.ipv4.neigh.enx3495db26e312.mcast_solicit = 3
net.ipv4.neigh.enx3495db26e312.proxy_delay = 80
net.ipv4.neigh.enx3495db26e312.proxy_qlen = 64
net.ipv4.neigh.enx3495db26e312.retrans_time_ms = 1000
net.ipv4.neigh.enx3495db26e312.ucast_solicit = 3
net.ipv4.neigh.enx3495db26e312.unres_qlen = 91
net.ipv4.neigh.enx3495db26e312.unres_qlen_bytes = 180224
net.ipv4.neigh.lo.anycast_delay = 100
net.ipv4.neigh.lo.app_solicit = 0
net.ipv4.neigh.lo.base_reachable_time_ms = 30000
net.ipv4.neigh.lo.delay_first_probe_time = 5
net.ipv4.neigh.lo.gc_stale_time = 60
net.ipv4.neigh.lo.interval_probe_time_ms = 5000
net.ipv4.neigh.lo.locktime = 100
net.ipv4.neigh.lo.mcast_resolicit = 0
net.ipv4.neigh.lo.mcast_solicit = 3
net.ipv4.neigh.lo.proxy_delay = 80
net.ipv4.neigh.lo.proxy_qlen = 64
net.ipv4.neigh.lo.retrans_time_ms = 1000
net.ipv4.neigh.lo.ucast_solicit = 3
net.ipv4.neigh.lo.unres_qlen = 91
net.ipv4.neigh.lo.unres_qlen_bytes = 180224
net.ipv4.neigh.sit0.anycast_delay = 100
net.ipv4.neigh.sit0.app_solicit = 0
net.ipv4.neigh.sit0.base_reachable_time_ms = 30000
net.ipv4.neigh.sit0.delay_first_probe_time = 5
net.ipv4.neigh.sit0.gc_stale_time = 60
net.ipv4.neigh.sit0.interval_probe_time_ms = 5000
net.ipv4.neigh.sit0.locktime = 100
net.ipv4.neigh.sit0.mcast_resolicit = 0
net.ipv4.neigh.sit0.mcast_solicit = 3
net.ipv4.neigh.sit0.proxy_delay = 80
net.ipv4.neigh.sit0.proxy_qlen = 64
net.ipv4.neigh.sit0.retrans_time_ms = 1000
net.ipv4.neigh.sit0.ucast_solicit = 3
net.ipv4.neigh.sit0.unres_qlen = 91
net.ipv4.neigh.sit0.unres_qlen_bytes = 180224
net.ipv4.nexthop_compat_mode = 1
net.ipv4.ping_group_range = 0 2147483647
net.ipv4.route.error_burst = 500
net.ipv4.route.error_cost = 100
net.ipv4.route.gc_elasticity = 8
net.ipv4.route.gc_interval = 60
net.ipv4.route.gc_min_interval = 0
net.ipv4.route.gc_min_interval_ms = 500
net.ipv4.route.gc_thresh = -1
net.ipv4.route.gc_timeout = 300
net.ipv4.route.max_size = 2147483647
net.ipv4.route.min_adv_mss = 256
net.ipv4.route.min_pmtu = 552
net.ipv4.route.mtu_expires = 600
net.ipv4.route.redirect_load = 2
net.ipv4.route.redirect_number = 9
net.ipv4.route.redirect_silence = 2048
net.ipv4.tcp_abort_on_overflow = 0
net.ipv4.tcp_adv_win_scale = 1
net.ipv4.tcp_allowed_congestion_control = reno cubic
net.ipv4.tcp_app_win = 31
net.ipv4.tcp_autocorking = 1
net.ipv4.tcp_available_congestion_control = reno cubic
net.ipv4.tcp_available_ulp =
net.ipv4.tcp_base_mss = 1024
net.ipv4.tcp_challenge_ack_limit = 2147483647
net.ipv4.tcp_child_ehash_entries = 0
net.ipv4.tcp_comp_sack_delay_ns = 1000000
net.ipv4.tcp_comp_sack_nr = 44
net.ipv4.tcp_comp_sack_slack_ns = 100000
net.ipv4.tcp_congestion_control = cubic
net.ipv4.tcp_dsack = 1
net.ipv4.tcp_early_demux = 1
net.ipv4.tcp_early_retrans = 3
net.ipv4.tcp_ecn = 2
net.ipv4.tcp_ecn_fallback = 1
net.ipv4.tcp_ehash_entries = 1024
net.ipv4.tcp_fack = 0
net.ipv4.tcp_fastopen = 1
net.ipv4.tcp_fastopen_blackhole_timeout_sec = 0
net.ipv4.tcp_fastopen_key = 00000000-00000000-00000000-00000000
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_frto = 2
net.ipv4.tcp_fwmark_accept = 0
net.ipv4.tcp_invalid_ratelimit = 500
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_limit_output_bytes = 1048576
net.ipv4.tcp_low_latency = 0
net.ipv4.tcp_max_orphans = 512
net.ipv4.tcp_max_reordering = 300
net.ipv4.tcp_max_syn_backlog = 128
net.ipv4.tcp_max_tw_buckets = 512
net.ipv4.tcp_mem = 1323 1767 2646
net.ipv4.tcp_migrate_req = 0
net.ipv4.tcp_min_rtt_wlen = 300
net.ipv4.tcp_min_snd_mss = 48
net.ipv4.tcp_min_tso_segs = 2
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_mtu_probe_floor = 48
net.ipv4.tcp_mtu_probing = 0
net.ipv4.tcp_no_metrics_save = 0
net.ipv4.tcp_no_ssthresh_metrics_save = 1
net.ipv4.tcp_notsent_lowat = 4294967295
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_pacing_ca_ratio = 120
net.ipv4.tcp_pacing_ss_ratio = 200
net.ipv4.tcp_probe_interval = 600
net.ipv4.tcp_probe_threshold = 8
net.ipv4.tcp_recovery = 1
net.ipv4.tcp_reflect_tos = 0
net.ipv4.tcp_reordering = 3
net.ipv4.tcp_retrans_collapse = 1
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 15
net.ipv4.tcp_rfc1337 = 0
net.ipv4.tcp_rmem = 4096 131072 904992
net.ipv4.tcp_sack = 1
net.ipv4.tcp_shrink_window = 0
net.ipv4.tcp_slow_start_after_idle = 1
net.ipv4.tcp_stdurg = 0
net.ipv4.tcp_syn_retries = 6
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_thin_linear_timeouts = 0
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tso_rtt_log = 9
net.ipv4.tcp_tso_win_divisor = 3
net.ipv4.tcp_tw_reuse = 2
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_wmem = 4096 16384 904992
net.ipv4.tcp_workaround_signed_windows = 0
net.ipv4.udp_early_demux = 1
net.ipv4.udp_mem = 2649 3535 5298
net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096
net.ipv6.anycast_src_echo_reply = 0
net.ipv6.auto_flowlabels = 1
net.ipv6.bindv6only = 0
net.ipv6.conf.all.accept_dad = 0
net.ipv6.conf.all.accept_ra = 1
net.ipv6.conf.all.accept_ra_defrtr = 1
net.ipv6.conf.all.accept_ra_from_local = 0
net.ipv6.conf.all.accept_ra_min_hop_limit = 1
net.ipv6.conf.all.accept_ra_min_lft = 0
net.ipv6.conf.all.accept_ra_mtu = 1
net.ipv6.conf.all.accept_ra_pinfo = 1
net.ipv6.conf.all.accept_redirects = 1
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_untracked_na = 0
net.ipv6.conf.all.addr_gen_mode = 0
net.ipv6.conf.all.autoconf = 1
net.ipv6.conf.all.dad_transmits = 1
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.all.disable_policy = 0
net.ipv6.conf.all.drop_unicast_in_l2_multicast = 0
net.ipv6.conf.all.drop_unsolicited_na = 0
net.ipv6.conf.all.enhanced_dad = 1
net.ipv6.conf.all.force_mld_version = 0
net.ipv6.conf.all.force_tllao = 0
net.ipv6.conf.all.forwarding = 0
net.ipv6.conf.all.hop_limit = 64
net.ipv6.conf.all.ignore_routes_with_linkdown = 0
net.ipv6.conf.all.ioam6_enabled = 0
net.ipv6.conf.all.ioam6_id = 65535
net.ipv6.conf.all.ioam6_id_wide = 4294967295
net.ipv6.conf.all.keep_addr_on_down = 0
net.ipv6.conf.all.max_addresses = 16
net.ipv6.conf.all.max_desync_factor = 600
net.ipv6.conf.all.mldv1_unsolicited_report_interval = 10000
net.ipv6.conf.all.mldv2_unsolicited_report_interval = 1000
net.ipv6.conf.all.mtu = 1280
net.ipv6.conf.all.ndisc_evict_nocarrier = 1
net.ipv6.conf.all.ndisc_notify = 0
net.ipv6.conf.all.ndisc_tclass = 0
net.ipv6.conf.all.proxy_ndp = 0
net.ipv6.conf.all.ra_defrtr_metric = 1024
net.ipv6.conf.all.regen_max_retry = 3
net.ipv6.conf.all.router_solicitation_delay = 1
net.ipv6.conf.all.router_solicitation_interval = 4
net.ipv6.conf.all.router_solicitation_max_interval = 3600
net.ipv6.conf.all.router_solicitations = -1
net.ipv6.conf.all.rpl_seg_enabled = 0
net.ipv6.conf.all.seg6_enabled = 0
net.ipv6.conf.all.suppress_frag_ndisc = 1
net.ipv6.conf.all.temp_prefered_lft = 86400
net.ipv6.conf.all.temp_valid_lft = 604800
net.ipv6.conf.all.use_oif_addrs_only = 0
net.ipv6.conf.all.use_tempaddr = 0
net.ipv6.conf.default.accept_dad = 1
net.ipv6.conf.default.accept_ra = 1
net.ipv6.conf.default.accept_ra_defrtr = 1
net.ipv6.conf.default.accept_ra_from_local = 0
net.ipv6.conf.default.accept_ra_min_hop_limit = 1
net.ipv6.conf.default.accept_ra_min_lft = 0
net.ipv6.conf.default.accept_ra_mtu = 1
net.ipv6.conf.default.accept_ra_pinfo = 1
net.ipv6.conf.default.accept_redirects = 1
net.ipv6.conf.default.accept_source_route = 0
net.ipv6.conf.default.accept_untracked_na = 0
net.ipv6.conf.default.addr_gen_mode = 0
net.ipv6.conf.default.autoconf = 1
net.ipv6.conf.default.dad_transmits = 1
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.default.disable_policy = 0
net.ipv6.conf.default.drop_unicast_in_l2_multicast = 0
net.ipv6.conf.default.drop_unsolicited_na = 0
net.ipv6.conf.default.enhanced_dad = 1
net.ipv6.conf.default.force_mld_version = 0
net.ipv6.conf.default.force_tllao = 0
net.ipv6.conf.default.forwarding = 0
net.ipv6.conf.default.hop_limit = 64
net.ipv6.conf.default.ignore_routes_with_linkdown = 0
net.ipv6.conf.default.ioam6_enabled = 0
net.ipv6.conf.default.ioam6_id = 65535
net.ipv6.conf.default.ioam6_id_wide = 4294967295
net.ipv6.conf.default.keep_addr_on_down = 0
net.ipv6.conf.default.max_addresses = 16
net.ipv6.conf.default.max_desync_factor = 600
net.ipv6.conf.default.mldv1_unsolicited_report_interval = 10000
net.ipv6.conf.default.mldv2_unsolicited_report_interval = 1000
net.ipv6.conf.default.mtu = 1280
net.ipv6.conf.default.ndisc_evict_nocarrier = 1
net.ipv6.conf.default.ndisc_notify = 0
net.ipv6.conf.default.ndisc_tclass = 0
net.ipv6.conf.default.proxy_ndp = 0
net.ipv6.conf.default.ra_defrtr_metric = 1024
net.ipv6.conf.default.regen_max_retry = 3
net.ipv6.conf.default.router_solicitation_delay = 1
net.ipv6.conf.default.router_solicitation_interval = 4
net.ipv6.conf.default.router_solicitation_max_interval = 3600
net.ipv6.conf.default.router_solicitations = -1
net.ipv6.conf.default.rpl_seg_enabled = 0
net.ipv6.conf.default.seg6_enabled = 0
net.ipv6.conf.default.suppress_frag_ndisc = 1
net.ipv6.conf.default.temp_prefered_lft = 86400
net.ipv6.conf.default.temp_valid_lft = 604800
net.ipv6.conf.default.use_oif_addrs_only = 0
net.ipv6.conf.default.use_tempaddr = 0
net.ipv6.conf.enx3495db26e312.accept_dad = 1
net.ipv6.conf.enx3495db26e312.accept_ra = 0
net.ipv6.conf.enx3495db26e312.accept_ra_defrtr = 1
net.ipv6.conf.enx3495db26e312.accept_ra_from_local = 0
net.ipv6.conf.enx3495db26e312.accept_ra_min_hop_limit = 1
net.ipv6.conf.enx3495db26e312.accept_ra_min_lft = 0
net.ipv6.conf.enx3495db26e312.accept_ra_mtu = 1
net.ipv6.conf.enx3495db26e312.accept_ra_pinfo = 1
net.ipv6.conf.enx3495db26e312.accept_redirects = 1
net.ipv6.conf.enx3495db26e312.accept_source_route = 0
net.ipv6.conf.enx3495db26e312.accept_untracked_na = 0
net.ipv6.conf.enx3495db26e312.addr_gen_mode = 0
net.ipv6.conf.enx3495db26e312.autoconf = 1
net.ipv6.conf.enx3495db26e312.dad_transmits = 1
net.ipv6.conf.enx3495db26e312.disable_ipv6 = 0
net.ipv6.conf.enx3495db26e312.disable_policy = 0
net.ipv6.conf.enx3495db26e312.drop_unicast_in_l2_multicast = 0
net.ipv6.conf.enx3495db26e312.drop_unsolicited_na = 0
net.ipv6.conf.enx3495db26e312.enhanced_dad = 1
net.ipv6.conf.enx3495db26e312.force_mld_version = 0
net.ipv6.conf.enx3495db26e312.force_tllao = 0
net.ipv6.conf.enx3495db26e312.forwarding = 0
net.ipv6.conf.enx3495db26e312.hop_limit = 64
net.ipv6.conf.enx3495db26e312.ignore_routes_with_linkdown = 0
net.ipv6.conf.enx3495db26e312.ioam6_enabled = 0
net.ipv6.conf.enx3495db26e312.ioam6_id = 65535
net.ipv6.conf.enx3495db26e312.ioam6_id_wide = 4294967295
net.ipv6.conf.enx3495db26e312.keep_addr_on_down = 0
net.ipv6.conf.enx3495db26e312.max_addresses = 16
net.ipv6.conf.enx3495db26e312.max_desync_factor = 600
net.ipv6.conf.enx3495db26e312.mldv1_unsolicited_report_interval = 10000
net.ipv6.conf.enx3495db26e312.mldv2_unsolicited_report_interval = 1000
net.ipv6.conf.enx3495db26e312.mtu = 1500
net.ipv6.conf.enx3495db26e312.ndisc_evict_nocarrier = 1
net.ipv6.conf.enx3495db26e312.ndisc_notify = 0
net.ipv6.conf.enx3495db26e312.ndisc_tclass = 0
net.ipv6.conf.enx3495db26e312.proxy_ndp = 0
net.ipv6.conf.enx3495db26e312.ra_defrtr_metric = 1024
net.ipv6.conf.enx3495db26e312.regen_max_retry = 3
net.ipv6.conf.enx3495db26e312.router_solicitation_delay = 1
net.ipv6.conf.enx3495db26e312.router_solicitation_interval = 4
net.ipv6.conf.enx3495db26e312.router_solicitation_max_interval = 3600
net.ipv6.conf.enx3495db26e312.router_solicitations = -1
net.ipv6.conf.enx3495db26e312.rpl_seg_enabled = 0
net.ipv6.conf.enx3495db26e312.seg6_enabled = 0
net.ipv6.conf.enx3495db26e312.suppress_frag_ndisc = 1
net.ipv6.conf.enx3495db26e312.temp_prefered_lft = 86400
net.ipv6.conf.enx3495db26e312.temp_valid_lft = 604800
net.ipv6.conf.enx3495db26e312.use_oif_addrs_only = 0
net.ipv6.conf.enx3495db26e312.use_tempaddr = 0
net.ipv6.conf.lo.accept_dad = -1
net.ipv6.conf.lo.accept_ra = 1
net.ipv6.conf.lo.accept_ra_defrtr = 1
net.ipv6.conf.lo.accept_ra_from_local = 0
net.ipv6.conf.lo.accept_ra_min_hop_limit = 1
net.ipv6.conf.lo.accept_ra_min_lft = 0
net.ipv6.conf.lo.accept_ra_mtu = 1
net.ipv6.conf.lo.accept_ra_pinfo = 1
net.ipv6.conf.lo.accept_redirects = 1
net.ipv6.conf.lo.accept_source_route = 0
net.ipv6.conf.lo.accept_untracked_na = 0
net.ipv6.conf.lo.addr_gen_mode = 0
net.ipv6.conf.lo.autoconf = 1
net.ipv6.conf.lo.dad_transmits = 1
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.lo.disable_policy = 0
net.ipv6.conf.lo.drop_unicast_in_l2_multicast = 0
net.ipv6.conf.lo.drop_unsolicited_na = 0
net.ipv6.conf.lo.enhanced_dad = 1
net.ipv6.conf.lo.force_mld_version = 0
net.ipv6.conf.lo.force_tllao = 0
net.ipv6.conf.lo.forwarding = 0
net.ipv6.conf.lo.hop_limit = 64
net.ipv6.conf.lo.ignore_routes_with_linkdown = 0
net.ipv6.conf.lo.ioam6_enabled = 0
net.ipv6.conf.lo.ioam6_id = 65535
net.ipv6.conf.lo.ioam6_id_wide = 4294967295
net.ipv6.conf.lo.keep_addr_on_down = 0
net.ipv6.conf.lo.max_addresses = 16
net.ipv6.conf.lo.max_desync_factor = 600
net.ipv6.conf.lo.mldv1_unsolicited_report_interval = 10000
net.ipv6.conf.lo.mldv2_unsolicited_report_interval = 1000
net.ipv6.conf.lo.mtu = 65536
net.ipv6.conf.lo.ndisc_evict_nocarrier = 1
net.ipv6.conf.lo.ndisc_notify = 0
net.ipv6.conf.lo.ndisc_tclass = 0
net.ipv6.conf.lo.proxy_ndp = 0
net.ipv6.conf.lo.ra_defrtr_metric = 1024
net.ipv6.conf.lo.regen_max_retry = 3
net.ipv6.conf.lo.router_solicitation_delay = 1
net.ipv6.conf.lo.router_solicitation_interval = 4
net.ipv6.conf.lo.router_solicitation_max_interval = 3600
net.ipv6.conf.lo.router_solicitations = -1
net.ipv6.conf.lo.rpl_seg_enabled = 0
net.ipv6.conf.lo.seg6_enabled = 0
net.ipv6.conf.lo.suppress_frag_ndisc = 1
net.ipv6.conf.lo.temp_prefered_lft = 86400
net.ipv6.conf.lo.temp_valid_lft = 604800
net.ipv6.conf.lo.use_oif_addrs_only = 0
net.ipv6.conf.lo.use_tempaddr = -1
net.ipv6.conf.sit0.accept_dad = -1
net.ipv6.conf.sit0.accept_ra = 1
net.ipv6.conf.sit0.accept_ra_defrtr = 1
net.ipv6.conf.sit0.accept_ra_from_local = 0
net.ipv6.conf.sit0.accept_ra_min_hop_limit = 1
net.ipv6.conf.sit0.accept_ra_min_lft = 0
net.ipv6.conf.sit0.accept_ra_mtu = 1
net.ipv6.conf.sit0.accept_ra_pinfo = 1
net.ipv6.conf.sit0.accept_redirects = 1
net.ipv6.conf.sit0.accept_source_route = 0
net.ipv6.conf.sit0.accept_untracked_na = 0
net.ipv6.conf.sit0.addr_gen_mode = 0
net.ipv6.conf.sit0.autoconf = 1
net.ipv6.conf.sit0.dad_transmits = 1
net.ipv6.conf.sit0.disable_ipv6 = 0
net.ipv6.conf.sit0.disable_policy = 0
net.ipv6.conf.sit0.drop_unicast_in_l2_multicast = 0
net.ipv6.conf.sit0.drop_unsolicited_na = 0
net.ipv6.conf.sit0.enhanced_dad = 1
net.ipv6.conf.sit0.force_mld_version = 0
net.ipv6.conf.sit0.force_tllao = 0
net.ipv6.conf.sit0.forwarding = 0
net.ipv6.conf.sit0.hop_limit = 64
net.ipv6.conf.sit0.ignore_routes_with_linkdown = 0
net.ipv6.conf.sit0.ioam6_enabled = 0
net.ipv6.conf.sit0.ioam6_id = 65535
net.ipv6.conf.sit0.ioam6_id_wide = 4294967295
net.ipv6.conf.sit0.keep_addr_on_down = 0
net.ipv6.conf.sit0.max_addresses = 16
net.ipv6.conf.sit0.max_desync_factor = 600
net.ipv6.conf.sit0.mldv1_unsolicited_report_interval = 10000
net.ipv6.conf.sit0.mldv2_unsolicited_report_interval = 1000
net.ipv6.conf.sit0.mtu = 1480
net.ipv6.conf.sit0.ndisc_evict_nocarrier = 1
net.ipv6.conf.sit0.ndisc_notify = 0
net.ipv6.conf.sit0.ndisc_tclass = 0
net.ipv6.conf.sit0.proxy_ndp = 0
net.ipv6.conf.sit0.ra_defrtr_metric = 1024
net.ipv6.conf.sit0.regen_max_retry = 3
net.ipv6.conf.sit0.router_solicitation_delay = 1
net.ipv6.conf.sit0.router_solicitation_interval = 4
net.ipv6.conf.sit0.router_solicitation_max_interval = 3600
net.ipv6.conf.sit0.router_solicitations = -1
net.ipv6.conf.sit0.rpl_seg_enabled = 0
net.ipv6.conf.sit0.seg6_enabled = 0
net.ipv6.conf.sit0.suppress_frag_ndisc = 1
net.ipv6.conf.sit0.temp_prefered_lft = 86400
net.ipv6.conf.sit0.temp_valid_lft = 604800
net.ipv6.conf.sit0.use_oif_addrs_only = 0
net.ipv6.conf.sit0.use_tempaddr = -1
net.ipv6.fib_multipath_hash_fields = 7
net.ipv6.fib_multipath_hash_policy = 0
net.ipv6.fib_notify_on_flag_change = 0
net.ipv6.flowlabel_consistency = 1
net.ipv6.flowlabel_reflect = 0
net.ipv6.flowlabel_state_ranges = 0
net.ipv6.fwmark_reflect = 0
net.ipv6.icmp.echo_ignore_all = 0
net.ipv6.icmp.echo_ignore_anycast = 0
net.ipv6.icmp.echo_ignore_multicast = 0
net.ipv6.icmp.ratelimit = 1000
net.ipv6.icmp.ratemask = 0-1,3-127
net.ipv6.idgen_delay = 1
net.ipv6.idgen_retries = 3
net.ipv6.ioam6_id = 16777215
net.ipv6.ioam6_id_wide = 4294967295 16777215
net.ipv6.ip6frag_high_thresh = 4194304
net.ipv6.ip6frag_low_thresh = 3145728
net.ipv6.ip6frag_secret_interval = 0
net.ipv6.ip6frag_time = 60
net.ipv6.ip_nonlocal_bind = 0
net.ipv6.max_dst_opts_length = 2147483647
net.ipv6.max_dst_opts_number = 8
net.ipv6.max_hbh_length = 2147483647
net.ipv6.max_hbh_opts_number = 8
net.ipv6.mld_max_msf = 64
net.ipv6.mld_qrv = 2
net.ipv6.neigh.default.anycast_delay = 100
net.ipv6.neigh.default.app_solicit = 0
net.ipv6.neigh.default.base_reachable_time_ms = 30000
net.ipv6.neigh.default.delay_first_probe_time = 5
net.ipv6.neigh.default.gc_interval = 30
net.ipv6.neigh.default.gc_stale_time = 60
net.ipv6.neigh.default.gc_thresh1 = 128
net.ipv6.neigh.default.gc_thresh2 = 512
net.ipv6.neigh.default.gc_thresh3 = 1024
net.ipv6.neigh.default.interval_probe_time_ms = 5000
net.ipv6.neigh.default.locktime = 0
net.ipv6.neigh.default.mcast_resolicit = 0
net.ipv6.neigh.default.mcast_solicit = 3
net.ipv6.neigh.default.proxy_delay = 80
net.ipv6.neigh.default.proxy_qlen = 64
net.ipv6.neigh.default.retrans_time_ms = 1000
net.ipv6.neigh.default.ucast_solicit = 3
net.ipv6.neigh.default.unres_qlen = 91
net.ipv6.neigh.default.unres_qlen_bytes = 180224
net.ipv6.neigh.enx3495db26e312.anycast_delay = 100
net.ipv6.neigh.enx3495db26e312.app_solicit = 0
net.ipv6.neigh.enx3495db26e312.base_reachable_time_ms = 30000
net.ipv6.neigh.enx3495db26e312.delay_first_probe_time = 5
net.ipv6.neigh.enx3495db26e312.gc_stale_time = 60
net.ipv6.neigh.enx3495db26e312.interval_probe_time_ms = 5000
net.ipv6.neigh.enx3495db26e312.locktime = 0
net.ipv6.neigh.enx3495db26e312.mcast_resolicit = 0
net.ipv6.neigh.enx3495db26e312.mcast_solicit = 3
net.ipv6.neigh.enx3495db26e312.proxy_delay = 80
net.ipv6.neigh.enx3495db26e312.proxy_qlen = 64
net.ipv6.neigh.enx3495db26e312.retrans_time_ms = 1000
net.ipv6.neigh.enx3495db26e312.ucast_solicit = 3
net.ipv6.neigh.enx3495db26e312.unres_qlen = 91
net.ipv6.neigh.enx3495db26e312.unres_qlen_bytes = 180224
net.ipv6.neigh.lo.anycast_delay = 100
net.ipv6.neigh.lo.app_solicit = 0
net.ipv6.neigh.lo.base_reachable_time_ms = 30000
net.ipv6.neigh.lo.delay_first_probe_time = 5
net.ipv6.neigh.lo.gc_stale_time = 60
net.ipv6.neigh.lo.interval_probe_time_ms = 5000
net.ipv6.neigh.lo.locktime = 0
net.ipv6.neigh.lo.mcast_resolicit = 0
net.ipv6.neigh.lo.mcast_solicit = 3
net.ipv6.neigh.lo.proxy_delay = 80
net.ipv6.neigh.lo.proxy_qlen = 64
net.ipv6.neigh.lo.retrans_time_ms = 1000
net.ipv6.neigh.lo.ucast_solicit = 3
net.ipv6.neigh.lo.unres_qlen = 91
net.ipv6.neigh.lo.unres_qlen_bytes = 180224
net.ipv6.neigh.sit0.anycast_delay = 100
net.ipv6.neigh.sit0.app_solicit = 0
net.ipv6.neigh.sit0.base_reachable_time_ms = 30000
net.ipv6.neigh.sit0.delay_first_probe_time = 5
net.ipv6.neigh.sit0.gc_stale_time = 60
net.ipv6.neigh.sit0.interval_probe_time_ms = 5000
net.ipv6.neigh.sit0.locktime = 0
net.ipv6.neigh.sit0.mcast_resolicit = 0
net.ipv6.neigh.sit0.mcast_solicit = 3
net.ipv6.neigh.sit0.proxy_delay = 80
net.ipv6.neigh.sit0.proxy_qlen = 64
net.ipv6.neigh.sit0.retrans_time_ms = 1000
net.ipv6.neigh.sit0.ucast_solicit = 3
net.ipv6.neigh.sit0.unres_qlen = 91
net.ipv6.neigh.sit0.unres_qlen_bytes = 180224
net.ipv6.route.gc_elasticity = 9
net.ipv6.route.gc_interval = 30
net.ipv6.route.gc_min_interval = 0
net.ipv6.route.gc_min_interval_ms = 500
net.ipv6.route.gc_thresh = 1024
net.ipv6.route.gc_timeout = 60
net.ipv6.route.max_size = 4096
net.ipv6.route.min_adv_mss = 1220
net.ipv6.route.mtu_expires = 600
net.ipv6.route.skip_notify_on_dev_down = 0
net.ipv6.seg6_flowlabel = 0
net.unix.max_dgram_qlen = 512
sunrpc.max_resvport = 1023
sunrpc.min_resvport = 665
sunrpc.tcp_fin_timeout = 15
sunrpc.tcp_max_slot_table_entries = 65536
sunrpc.tcp_slot_table_entries = 2
sunrpc.udp_slot_table_entries = 16
user.max_cgroup_namespaces = 899
user.max_inotify_instances = 128
user.max_inotify_watches = 8192
user.max_ipc_namespaces = 899
user.max_mnt_namespaces = 899
user.max_net_namespaces = 899
user.max_pid_namespaces = 899
user.max_time_namespaces = 899
user.max_user_namespaces = 899
user.max_uts_namespaces = 899
vm.admin_reserve_kbytes = 3547
vm.compact_unevictable_allowed = 1
vm.compaction_proactiveness = 20
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.dirtytime_expire_seconds = 43200
vm.extfrag_threshold = 500
vm.laptop_mode = 0
vm.legacy_va_layout = 0
vm.lowmem_reserve_ratio = 32 0
vm.max_map_count = 1048576
vm.min_free_kbytes = 1357
vm.mmap_min_addr = 4096
vm.mmap_rnd_bits = 8
vm.oom_dump_tasks = 1
vm.oom_kill_allocating_task = 0
vm.overcommit_kbytes = 0
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
vm.page-cluster = 3
vm.page_lock_unfairness = 5
vm.panic_on_oom = 0
vm.percpu_pagelist_high_fraction = 0
vm.swappiness = 60
vm.user_reserve_kbytes = 3547
vm.vfs_cache_pressure = 100
vm.watermark_boost_factor = 15000
vm.watermark_scale_factor = 10
user@brain:~$
sysctl.conf 最適化項目の解説
カテゴリ パラメータ 設定値 設定変更の狙い (電子辞書環境への効果) メモリ vm.swappiness0SDカードへのスワップを極限まで禁止。 物理RAMが本当にゼロになるまで1GBのスワップファイルへの書き込みを拒否し、SDカードのI/Oによる「突発的なフリーズ(プチフリ)」を力技で防止する。 レスポンス向上に有効ですがデメリットもあります。 ・メモリ不足時のOOM発生が早まる →スワップ領域を大きめに作成 ・Firefox等アプリによってはでは逆効果の場合もありますメモリ vm.vfs_cache_pressure50ゲームの読み込みを高速化。 ディレクトリやファイルのキャッシュ(VFSキャッシュ)をデフォルトよりメモリ上に長く保持させ、ゲーム中の画像や音声データの再読み込みによるカクつきを減らすことが見込めます。 (デフォルト値:100)I/O vm.dirty_ratio5SDカードの「プチフリ」防止(第1弾)。 メモリ上に溜め込める未書き込みデータの上限を物理RAMの5%に制限しまu。 データが大量に溜まってから一気にSDカードへ書き込まれることによる、システム全体の数秒間のフリーズを防ぐ効果が期待できます。I/O vm.dirty_background_ratio2SDカードの「プチフリ」防止(第2弾)。 未書き込みデータが2%に達した時点で、裏で少しずつSDカードへの書き込み(バックグラウンドフラッシュ)を開始させるようにします。I/O vm.dirty_expire_centisecs1000書き込み猶予の短縮。 メモリ上にデータが生まれてから10秒(1000センチ秒)経ったら書き込み対象にする。データを長く持ちすぎず、小まめにSDカードへ流します。I/O vm.dirty_writeback_centisecs300書き込みプロセスの頻繁な起動。 3秒(300センチ秒)に1回、バックグラウンドの書き込みスレッドを起動してメモリをチェックさせる。これによりI/O負荷を極小に分散を期待。CPU kernel.sched_child_runs_first0親プロセスのカクつき防止。 プロセスが新しく子プロセスを作った(forkした)際、子プロセスを無理に優先させず親プロセスの処理を継続する。ゲームのバックグラウンド処理などで一瞬挙動が重くなるのを防ぎます。ネット net.ipv4.tcp_rmem4096 87380 131072受信バッファの制限。 ネットワーク受信に使うメモリ上限を最大128KBに制限し、貴重な物理RAMの浪費を徹底的に抑えます。ネット net.ipv4.tcp_wmem4096 65536 131072送信バッファの制限。 ネットワーク送信に使うメモリ上限を最大128KBに制限し、上記同様にメモリを節約します。ネット net.ipv4.tcp_fin_timeout15切断待ちの高速化。 通信が切断された後の無駄な待ち時間を15秒に短縮し、通信用のソケットリソースを素早く解放するようにします。ネット net.ipv4.tcp_tw_reuse1ソケットの再利用。 TIME_WAIT 状態にある古いソケットを新しい通信で即座に使い回し、カーネルのメモリ消費と管理負荷を減らします。カーネル kernel.printk3 3 3 3ログ出力によるCPU負荷の軽減。 画面(コンソール)やバックグラウンドへのシステムログ出力レベルを制限し、ゲームプレイ中などにログ書き込みの負荷でガタつくのを防きます。カーネル vm.oom_kill_allocating_task1完全フリーズの回避。 万が一ZRAMも1GBスワップも限界に達した際、カーネルが「どのプロセスを殺すか」を重い処理で探索するのをやめ、「今メモリを要求したタスク」を即座に強制終了(Kill)してシステム全体のハングアップを防ぎます。カーネル vm.panic_on_oom0システム巻き込み防止。 メモリ枯渇(OOM)が発生しても、カーネルパニックを起こしてシステムを強制再起動・完全フリーズさせず、OS全体の生存を最優先させます。
ZSWAPの有効化
ZSWAPとは、Linuxカーネルに備わっている仮想メモリ圧縮機能の一つです。
通常、物理メモリが足りなくなると、スワップ領域が設定されていれば仮想メモリ帰庫で、 SD領域に別途作成したスワップ領域にメモリの一部を退避します。
しかし、Brainuxの場合メモリ容量が128MBと小さいこともありますが、 SDへの書き込みが致命的レベルに遅いため、 出来るだけ書き出し(スワップアウト)を抑制したいところです。
カーネルパラメータ[vm.swappiness=0]にて、出来るだけスワップ領域を使わない設定にしていますが、アプリのビルド時などでどうしても使うメモリ量が増えることもあるので、 この辺を対策します。(特にLToを有効にしてビルドすると大量のメモリを消費します。) ZSWAPは、物理メモリ(RAM)が不足し、データをハードディスクやSSD(スワップ領域)に退避させる(スワップアウト)際、そのままディスクに書き込むのではなく、メモリ領域上でデータを圧縮して一時保存(キャッシュ)します。 メモリ領域がいっぱいになったり、圧縮されないようなデータについては、 スワップ領域に保存されます。
zswapの仕組みとメリット
メモリのデータを圧縮して保持 RAMが不足してスワップアウトが発生しそうになると、zswapはそのデータを自動的に圧縮し、RAM内に確保された専用のプール(キャッシュ領域)に保存します。 また、圧縮できなかったデータはそのままDiskのスワップ領域に保存されます。
圧倒的な高速化 データの圧縮・展開には少量のCPUパワーを消費しますが、遅いSSD/HDDに直接アクセスするよりも遥かに高速に処理できるため、メモリ不足時のカクつき(スラッシング)が大幅に軽減されます。
ストレージ(SSD)の寿命を延ばす 圧縮キャッシュが満杯になるまではストレージへの書き込みが発生しないため、スワップの頻発によるSSDの劣化を防ぐことができます。容量が溢れた場合は、使用頻度の低いデータから順に物理ディスクのスワップ領域へと書き出されます(ライトバック)
Linuxカーネルの確認
zswapには、Linuxカーネルビルド時に、モジュール組み込みが必要です。 Brainuxのビルド時の.configファイルを確認してみます。
$ zcat /proc/config.gz > ~/debian.connfig $ grep “ZSWAP” ~/debian.connfig
$ zcat /proc/config.gz > ~/debian.connfig
$ grep "ZSWAP" ~/debian.connfig
CONFIG_ZSWAP=y
# CONFIG_ZSWAP_DEFAULT_ON is not set
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE is not set
CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO=y
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_842 is not set
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 is not set
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4HC is not set
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD is not set
CONFIG_ZSWAP_COMPRESSOR_DEFAULT="lzo"
CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD=y
# CONFIG_ZSWAP_ZPOOL_DEFAULT_Z3FOLD is not set
# CONFIG_ZSWAP_ZPOOL_DEFAULT_ZSMALLOC is not set
CONFIG_ZSWAP_ZPOOL_DEFAULT="zbud"
$
こちらを確認すると、以下のようになっていました。 ZSWAP:有効 圧縮プロトコル:lzo のみ有効(デフォルト) CPU負荷が非常に低い。圧縮率2倍程度 ZPOOL方式 :zbud のみ有効(デフォルト) 1つの物理ページ(通常4KB)に最大2つの圧縮ページを格納し、 メモリ効率を高めるための仕組み
とりあえずカーネル上はZSWAPは有効になっていることを確認できました。
手動での有効化
まずは、現状、swap領域が有効になっているかを確認します。
$ sudo swapon –show
$ sudo swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 1024M 65.3M -2
スワップ領域として、1GBが割り当てされているのが確認できました。 もし、まだスワップ領域を作成していない場合には、 作成しておきましょう。
SWAP領域の確保
現在のZSWAPの稼働状況を確認します。 $ cat /sys/module/zswap/parameters/enabled
$ cat /sys/module/zswap/parameters/enabled
N
Nなので、現状は無効です。(これがデフォルト)
これを一時的に有効化します。 $ echo Y | sudo tee /sys/module/zswap/parameters/enabled > /dev/null
$ echo Y | sudo tee /sys/module/zswap/parameters/enabled > /dev/null
ZSWAPの設定・稼働確認
SWAPの設定の確認は、コマンドで可能です。
#設定の確認 $ grep -H . /sys/module/zswap/parameters/{enabled,compressor,max_pool_percent}
$ grep -r . /sys/module/zswap/parameters/
/sys/module/zswap/parameters/accept_threshold_percent:90
/sys/module/zswap/parameters/enabled:Y
/sys/module/zswap/parameters/max_pool_percent:20
/sys/module/zswap/parameters/zpool:zbud
/sys/module/zswap/parameters/same_filled_pages_enabled:Y
/sys/module/zswap/parameters/non_same_filled_pages_enabled:Y
/sys/module/zswap/parameters/compressor:lzo
zpool: zbud (1ページに2つまでしか詰め込めない、少し古い世代の管理方式) compressor: lzo (軽量ですが圧縮率は控えめ) max_pool_percent: 20 (メモリ128MB(使用可能分112MB)だと約22MB程度) max_pool_percentは大きくしすぎると、プログラムが使用できる素のメモリ容量が少なくなるので注意してください。変わりに仮想メモリトータルの使用可能量は大きくなります。 メモリ 112-22 = 90MB ZSWAP仮想メモリ (22*2) = 44MB 仮想メモリ全体 (112-22)MB+(22*2) MB +1024GB
SWAPの稼働状況は、以下のコマンドで可能です。
#ZSWAPの状況 $ sudo watch -n 5 “grep -r . /sys/kernel/debug/zswap/”
Every 5.0s: grep -r . /sys/kernel/debug/zswap/ brain: Mon Nov 2 17:18:13 2026
/sys/kernel/debug/zswap/same_filled_pages:173
/sys/kernel/debug/zswap/stored_pages:7521
/sys/kernel/debug/zswap/pool_total_size:15581184
/sys/kernel/debug/zswap/duplicate_entry:0
/sys/kernel/debug/zswap/written_back_pages:0
/sys/kernel/debug/zswap/reject_compress_poor:75
/sys/kernel/debug/zswap/reject_kmemcache_fail:0
/sys/kernel/debug/zswap/reject_alloc_fail:0
/sys/kernel/debug/zswap/reject_reclaim_fail:0
/sys/kernel/debug/zswap/pool_limit_hit:0
zswap稼働ステータスの分析
メモリ節約の効果(大) • stored_pages: 7521ページ(約29.4 MB分)のデータが圧縮されて zswap内に格納されています。 • pool_total_size: 15,581,184 バイト(約14.9 MB)です。 • 約29.4 MBのデータを、半分の約14.9 MBに圧縮してメモリ上に保持できているため、 効率よく動いているようです。
ディスクへの書き込み(ゼロ) • written_back_pages: 0 • zswapから実際のストレージ(SSD/HDD)のスワップ領域へデータを追い出す 「ライトバック」が一度も発生していません。 つまりスワップ処理がすべて高速なRAM(メモリ)内で完結している理想的な状態です。
効率の悪いデータの拒否 • reject_compress_poor: 75 • 圧縮しても大してサイズが小さくならないページが75回拒否され、 直接ディスクのスワップへ送られました(75(Page) x 4096(Byte) = 0.3MB)。 圧縮効率が悪いデータは、無理に圧縮せずに直接スワップ領域することで、 ZWAPのメモリプールを効率的に使おうとしているようです。
同じ値で満たされたページ • same_filled_pages: 173 • すべてゼロなどの同じデータで埋まったページが173ページあり、これらは圧縮すら行わず超低コストで処理されています。
動作させるアプリによっては、 ZSWAPを有効にすると、逆に遅くなる可能もあるので 起動するかどうかは各自で判断してください。
自動起動の設定
動作に問題なければ、ZSWAPをOS起動時に自動的に有効にします。 まずは、systemd-tmpfilesが有効になっているかを確認します。 結果は「static」なのでこの仕組みを使って、OS起動時にZSWAPを動くようにします。
$ systemctl is-enabled systemd-tmpfiles-setup.service
static
/etc/tmpfiles.d/zswap.conf
cat << EOF | sudo tee /etc/tmpfiles.d/zswap.conf > /dev/null
# type path mode user group age argument
f /sys/module/zswap/parameters/max_pool_percent - - - -
w /sys/module/zswap/parameters/enabled - - - - Y
w /sys/module/zswap/parameters/max_pool_percent - - - - 20
w /sys/module/zswap/parameters/zpool - - - - zbud
EOF
変更後、Brainuxを再起動して、 改めてZSWAPの稼働状況を確認します。 $ cat /sys/module/zswap/parameters/enabled
$ cat /sys/module/zswap/parameters/enabled
Y
自動的にZSWAPが有効になりました。
一時的に無効にするには、 以下のコマンドを実行してください。 $ echo N | sudo tee /sys/module/zswap/parameters/enabled > /dev/null
もし、自動起動も停止したいということであれば、 /etc/tmpfiles.d/zswap.conf を編集して、コメント化してください。
ビルド実践
試しにStella の -O3 -flto ビルドをしてみましたが、問題なくビルド出来ました。
ZSWAPの運用的にも問題ないようです。
#ZSWAPの状況 $ sudo watch -n 5 “grep -r . /sys/kernel/debug/zswap/”
/sys/kernel/debug/zswap/same_filled_pages:52
/sys/kernel/debug/zswap/stored_pages:1316
/sys/kernel/debug/zswap/pool_total_size:2875392
/sys/kernel/debug/zswap/duplicate_entry:0
/sys/kernel/debug/zswap/written_back_pages:108
/sys/kernel/debug/zswap/reject_compress_poor:662
/sys/kernel/debug/zswap/reject_kmemcache_fail:0
/sys/kernel/debug/zswap/reject_alloc_fail:0
/sys/kernel/debug/zswap/reject_reclaim_fail:0
/sys/kernel/debug/zswap/pool_limit_hit:4024
ビルド完了後の統計分析
プール上限との激しい攻防 • pool_limit_hit: 4,024 回 • 前回の「2,521回」からさらに1,400回以上増加しました。やはりリンク(ld)フェーズで想像を絶するメモリ圧迫が発生し、zswapの20%制限の壁に何度も何度もぶつかっていたことが分かります。
microSD(実スワップ)への最終書き出し • written_back_pages: 0 → 108 ページ • 最終的に108ページ(約432KB)のデータが実スワップへとライトバックされました。 1GBの領域があったためシステムは余裕で耐えきれましたが、zswapが20%の制限内で粘り強くデータをRAM側に引き留めてくれたおかげで、microSDへの過度な書き込みアクセス(=極端な速度低下やカードの劣化)を最小限に抑え込めています。
現在のクリーンアップ状態 • stored_pages: 1,316 ページ (約5.1MB分) • pool_total_size: 2,875,392 バイト (約2.7MB) • ビルドプロセスが終了したため、メモリが大幅に解放されました。現在は、システムが動作を維持するために必要な最小限のデータ(約5.1MB分)が、約2.7MBに綺麗に圧縮されてzswap内にちょこんと残っている、非常に平和な状態に戻っています。
X11のフレームバッファ設定
SDL2の性能調査中に、比較対象の中に X11のShadowFBを有効/無効にを変更するとパフォーマンスが変わるようなので、 試しに実施してみました。
このShadowFBオプションは、 /etc/X11/xorg.conf 内の Option “ShadowFB” は、画面の描画内容をグラフィックカード(VRAM)に直接書き込まず、メインメモリ(RAM)上の「シャドウ・フレームバッファ(影の領域)」に一度描画してから、まとめてVRAMへ転送する機能になります。
高性能なGPUを使っている場合は不要(または無効化すべき)ですが、画面表示が極端に重い古い環境や組み込み環境で汎用ドライバーを使っている場合は、有効にすることで表示が滑らかになる選択肢です。 つまりBrainuxのようなGPUを持たないハードでは、有効にするのがセオリーです。
Brainuxも通常は有効になっていますが、 これを無効にして確かめてみました。
/etc/X11/xorg.confに追加 Section “Device”セクションの中に、以下の行を追加することで変更できます。 (デフォルトは有効なので、無効に変更します。)
Option "ShadowFB" "false"
sudo vi /etc/X11/xorg.conf
Section "Device"
Identifier "device"
Driver "fbdev"
Option "ShadowFB" "false"
EndSection
Section "Screen"
Identifier "screen"
Device "device"
EndSection
この変更を行った後で、 一度 jwmを終了し、再度 jwmを起動して下さい(X11の再起動です。)
すると、以下のグラフィック系ベンチマークが上がりました (何回か実行した平均値です。)
testsprite (SDL1.2のテストプログラム)
ShadowFB True 26
ShadowFB False 39 向上率 1.5
testsprite2 (SDL2のテストプログラム)
ShadowFB True 32
ShadowFB False 43 向上率 1.34倍
testdraw2 (SDL2のテストプログラム)
ShadowFB True 24
ShadowFB False 30 向上率 1.25倍
glxgears (OPENGL系グラフィックベンチメーク)
ShadowFB True 3
ShadowFB False 3 向上率 1.00倍(効果あり)
数値(おそらくFPS:1秒あたりのフレーム数)を見ると、 一般的なLinux環境とは真逆で、Brainuxにおいては ShadowFB False(無効)の方が パフォーマンスが良い(フレーム数が高い)という結果になっていました。
なお、OPENGL系のベンチはパフォーマンスは変わりませんでした。
なぜ Brainux で ShadowFB = False の方が速いのかの推測
この結果から推測してみました。
メインメモリ(RAM)とVRAMの「物理的な同一性」
PCなどの独立したグラフィックボードがある環境では「遅いVRAM」と「速いメインメモリ」が分かれているため、ShadowFB が有効に働きます。 しかし、BrainのSoC(i.MX28)はメインメモリの一部をVRAMとして共有(シェア)している、または極めて近いバスで直結されています。そのため、「メインメモリ上にシャドウバッファを作って、そこからVRAMにコピーする」という ShadowFB True の挙動は、「同じメモリ内でデータを2度転送しているだけ(無駄なオーバーヘッド)」になっている可能性が高いです。
CPU(ARM926EJ-S)の処理能力の限界
i.MX28のCPUは、2026年の基準から見ると非常に低クロック(約454MHz)かつシングルコアです。 ShadowFB True にすると、メインメモリから実際のフレームバッファへ画面を「コピー(転送)する処理」をCPUが純粋にソフトウェア的に処理しなければなりません。 このメモリ転送負荷(Memcpy)が、非力なCPUの大きな重荷になり、FPS低下(32→24、43→30)を招いていていると思われます。
glxgears がどちらも 3 FPS で変わらない理由
glxgears はOpenGL(3D)のテストですが、Brainuxにはハードウェア3Dアクセラレータがないため、すべてCPUで計算(ソフトウェアラスタライズ:Mesa/LLVMpipeなど)しています。 ここでは「3Dの計算(CPU処理)」があまりにも重すぎる(1秒間に3回計算するのが限界)ため(3D計算自体が完全に足を引っ張っている)、その後のメモリ転送方法が True だろうが False だろうが、結果に全く影響を与えていない状態と思われます。
以上より、.MX28では共有メモリ構成のためShadowFBのコピーオーバーヘッドが支配的になっている可能性があります また、OPENGL系ベンチは、メモリ転送方法に比べて3D計算自体が重いので、結果に表れなかったと思われます。
SDL2とSDL 1.2の内部挙動の違い、およびBrainuxにおける影響
SDL2とSDL 1.2の内部挙動の違い、およびBrainuxにおける影響は以下の通りです。
SDL 1.2 と SDL2 の大きな違い
SDL 1.2 (古い仕様): 基本的にすべてソフトウェア(CPU)でピクセルを計算し、 システムメモリ上のバッファ(サーフェス)に描画します。 ハードウェアによる描画支援(アクセラレーション)をほとんど使いません。
SDL2 (新しい仕様): 内部でOpenGLやOpenGLES、XRenderなどのハードウェアによる描画 (GPUアクセラレーション)を利用する設計が標準になっています。
なぜSDL 1.2でも ShadowFB False が正解なのか?
SDL 1.2はもともと「CPUで処理してメモリに書く」という動きをします。
ShadowFB True の場合: 「SDL1.2がCPUでメインメモリに描画する」 ➔ 「X11がそれをさらに別のシャドウバッファ(メインメモリ)にコピーする」 ➔ 「最終的に実際の液晶のフレームバッファ(メモリ)に転送される」 という、メモリ内での三重のコピー(無駄なオーバーヘッド)が発生してしまいます。
ShadowFB False の場合: SDL 1.2が描画した内容が、余計なクッションを挟まずに液晶のフレームバッファへダイレクトに転送されるため、非力なBrainのCPU負荷を最小限に抑えられると考えられます。
環境変数によるパフォーマンスチェック
SDLなどは、環境変数をチェックして動作を変更します。
例えば、X11上で、SDL1.2ベースのアプリを動かす場合には、 追加で、以下の設定も効果があるようです。
export SDL_VIDEO_X11_NODIRECTCOLOR=1
環境変数 SDL_VIDEO_X11_NODIRECTCOLOR=1 は、SDL 1.2 が XWindow System(X11)環境で画面を描画する際、カラーマップ(色情報の管理方式)の自動作成を無効化し、システムのデフォルト設定を強制的に使わせるための設定です。 一言で言うと、「色の管理をサボらせて、描画の処理を軽くする(エラーを防ぐ)」設定です。
SDL 1.2 は古いライブラリであるため、画面を表示するときに「この画面は何色(何ビットカラー)で描画するか」を厳密に制御しようとします。
指定しない場合(通常動作): SDL 1.2 は描画時に、より正確な色再現を行おうとして、X11 側に対して独自の「DirectColor(または PseudoColor)」というカラーマップ(色見本帳のようなもの)を新しく作ろうと要求します。
NODIRECTCOLOR=1 を指定した場合: 独自のカラーマップ作成を明示的に禁止します。代わりに、Linux デスクトップ(X11)が元々使っているデフォルトの画面色設定(通常は 16bit や 24bit TrueColor)をそのまま使い回します。
Brainux におけるメリット
無駄な色変換処理の削減(軽量化) Brain の非力な CPU 環境において、独自のカラーマップを計算・適用する処理はオーバーヘッドになります。これを無効化し、システムのデフォルトに「お任せ」することで、画面描画にかかる余計な CPU 負荷を減らすことができます。
画面の「色化け」や「チラつき」の防止 古い SDL アプリを X11 上で動かすと、アプリを起動した瞬間に画面全体の色が反転したり、サイケデリックな色合いに変色したり(カラーマップのバッティング)、最悪の場合は画面が正常に表示されずクラッシュすることがあります。この環境変数は、そうした色管理の衝突を防ぎ、安定して表示させるためのおまじないとして機能します
この設定を変更しても、特に画面描画には問題ないように見えますので、 いったんこの設定で運用してみたいと思います。
環境変数の自動設定
上記をふくめて、環境設定を調整しています。 いったん、~/.profile、~/.xprofileに以下の行を追加して運用しています。
~/.xprofile
#X11環境用環境変数
export SDL_VIDEODRIVER=x11
#export GALLIUM_DRIVER=llvmpipe
#export GALLIUM_DRIVER=""
#export SDL_VIDEO_GL_DRIVER=""
export vblank_mode=1
export SDL_NOMOUSE=0
#export SDL_RENDER_DRIVER=software
#export SDL_HINT_RENDER_DRIVER=software
export SDL_RENDER_VSYNC=1
#export LIBGL_ALWAYS_SOFTWARE=1
export LP_NUM_THREADS=1
export SDL_VIDEO_X11_NODIRECTCOLOR=1
export SDL_AUDIODRIVER=pulse
~/.profile
# すでに .xprofile 等で X11 用の変数が割り当てられている場合はスキップする
if [ "$MY_ENV_TYPE" != "X11" ]; then
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
# ----------------------------------
# SSHリモートログイン環境
# ----------------------------------
export DISPLAY=:0
export SDL_VIDEODRIVER=x11
#export GALLIUM_DRIVER=llvmpipe
export SDL_RENDER_VSYNC=1
export vblank_mode=0
export LP_NUM_THREADS=1
export SDL_VIDEO_X11_NODIRECTCOLOR=1
export SDL_NOMOUSE=0
else
# ----------------------------------
# CUIコンソール(実機ログイン)環境
# ----------------------------------
export SDL_VIDEODRIVER=fbcon
#export GALLIUM_DRIVER=llvmpipe
export SDL_RENDER_VSYNC=1
export vblank_mode=0
export LP_NUM_THREADS=1
export SDL_NOMOUSE=1
fi
fi
export SDL_AUDIODRIVER=pulse
参考: その他環境編集オプションが、速度にどれだけかかわるかも確認してみました。
export GALLIUM_DRIVER=”” 変わらない(29) export SDL_VIDEO_GL_DRIVER=”” 変わらない(29)export vblank_mode=0 1のほうが早い export SDL_RENDER_DRIVER=software 遅くなる(26) export SDL_HINT_RENDER_DRIVER=software 遅くなる(28) export SDL_RENDER_VSYNC=0 変わらない(29)#export LIBGL_ALWAYS_SOFTWARE=1 遅くなる(28) #export LP_NUM_THREADS=1 速くなる(時々30超える)
Views: 13