start

Emacs 26.1のc-modeのシンタックスハイライトが重いでござる(未解決)

EmacsでC++を書いてるとバッファが超重くなることがある。キー入力やスクロールがツーテンポくらい遅れる感じ。他のバッファには影響しないので物凄く困ってるわけではないが、地味にストレスでござる。

発生条件がさっぱりわからんのが困りどころ。重くなるファイルでも開いた直後は大丈夫だったりして、編集しているうちに何かの拍子で重くなる。ファイルの大きさ自体はさほど関係ないようだ(起きないやつは行数が多くても起きないし、起きるやつは100行程度のソースでも起きる)。何となく、コメントないしマルチバイト文字成分多めのファイル、C++11なコードで発生しやすいような感じ。

ほぼ間違いないのはc-modeが原因であるということ。他のmodeでは発生しないし…。恐らくFont Lockがらみが原因と思われる

(2019-07-09 追記)
M-x font-lock-modeでFont Lockの有無を切り替えると明らかに速度が変わるので、Font Lockがらみなのも間違いない。

未だ解決には至ってないが、毎度profileとるのが面倒なのでメモがてら記事にしとく。

Function                                                  CPU samples    %
- redisplay_internal (C function)                                 736  68%
 - jit-lock-function                                              731  68%
  - jit-lock-fontify-now                                          731  68%
   - jit-lock--run-functions                                      725  67%
    - run-hook-wrapped                                            725  67%
     - #<compiled 0x1b94275>                                      725  67%
      - font-lock-fontify-region                                  725  67%
       - c-font-lock-fontify-region                               722  67%
        - font-lock-default-fontify-region                        658  61%
         - font-lock-fontify-keywords-region                      647  60%
          - c-font-lock-declarations                              320  29%
           - c-find-decl-spots                                    313  29%
            - #<compiled 0x1c22bc1>                               234  21%
             - c-get-fontification-context                        125  11%
              - c-back-over-member-initializers                    64   5%
               + c-just-after-func-arglist-p                       18   1%
               + c-parse-state                                     16   1%
               + c-back-over-compound-identifier                   14   1%
               + c-at-toplevel-p                                   10   0%
               + c-backward-sws                                     5   0%
              + c-looking-at-or-maybe-in-bracelist                 47   4%
              + c-backward-token-2                                  6   0%
              + c-back-over-compound-identifier                     3   0%
             + c-forward-decl-or-cast-1                            60   5%
             + c-font-lock-single-decl                             15   1%
             + c-backward-sws                                      14   1%
             + c-backward-token-2                                   4   0%
               c-syntactic-re-search-forward                        2   0%
             + c-forward-label                                      1   0%
            + c-bs-at-toplevel-p                                   52   4%
            + c-beginning-of-macro                                  5   0%
            + c-forward-sws                                         3   0%
            + c-literal-start                                       1   0%
            c-font-lock-<>-arglists                                77   7%
          + #<compiled 0x1c2637d>                                  44   4%
          + c-font-lock-cut-off-declarators                        41   3%
          + c-font-lock-enclosing-decls                            34   3%
          + c-font-lock-enum-body                                  24   2%
            #<compiled 0x1c26351>                                  19   1%
          + c-font-lock-complex-decl-prepare                       11   1%
          + c-font-lock-enum-tail                                   8   0%
            #<compiled 0x1c272e7>                                   8   0%
          + c-font-lock-invalid-single-quotes                       7   0%
            #<compiled 0x1c272af>                                   6   0%
            #<compiled 0x1c2631b>                                   6   0%
            #<compiled 0x1c27285>                                   4   0%
            #<compiled 0x1c2633d>                                   4   0%
            #<compiled 0x1c263a3>                                   4   0%
            #<compiled 0x1c2630b>                                   3   0%
          + c-font-lock-raw-strings                                 3   0%
            whitespace-trailing-regexp                              1   0%
         + font-lock-fontify-syntactically-region                   7   0%
         + font-lock-unfontify-region                               1   0%
        + c-before-context-fl-expand-region                        64   5%
 + file-remote-p                                                    4   0%
 + eval                                                             1   0%
- ...                                                             232  21%
   Automatic GC                                                   232  21%
+ command-execute                                                 103   9%

御覧の通り、c-modeのFont Lockが原因なのは間違いないんだよなー。解決方法分からんけど。

以前はそれほど気にならなかったし設定も大して変えてないので、単にマシンがしょぼいだけって線も捨てきれない。一応マシンスペックも書いておく。

CPU Core i5-5200U (2.2GHz/2C4T)
RAM DDR3-1600 8GBx1
GPU HD Graphics 5500
HDD MQ01ABF050

前はUnreal Engine 4での開発に耐えられるようなデスクトップマシンだったのよねー。

FreeBSD 12のApache 2.4.39がunion semun ickふんだららでビルドエラー

FreeBSD 12.0-RELEASEへの更新中、www/apache24のports更新で以下のようなビルドエラーが起きた。

unixd.c:245:25: error: variable has incomplete type 'union semun'
            union semun ick;
                        ^
unixd.c:245:19: note: forward declaration of 'union semun'
            union semun ick;
                  ^
1 error generated.
*** [unixd.lo] Error code 1

union semunが定義されとらんとな…。

ググってみたら既にバグチケが上がっていた。メンテナ曰く、当該箇所を削除するか全部のトップレベルのportsをリビルドせよとの事だが、後者は面倒でござる。というか、“全てのトップレベル”の範囲がわからんかったので、ソース修正でどうにかする。

/usr/ports/www/apache24/work/httpd-2.4.39/os/unix/unixd.cの240行目付近、#if !APR_HAVE_UNION_SEMUNによってunion semunの定義がなくなっているようなので、#if#endifをコメントしてやる。

            apr_os_proc_mutex_t ospmutex;
//#if !APR_HAVE_UNION_SEMUN  ///★コメントアウト!
            union semun {
                long val;
                struct semid_ds *buf;
                unsigned short *array;
            };
//#endif  ///★コメントアウト!
            union semun ick;
            struct semid_ds buf = { { 0 } };

あとは/usr/ports/www/apache24の下でmake installすればビルドは通る。……が、起動しようとするとSegmentation faultで落ちるぅorz。

見た感じdevel/apr1関係のコードのような気がするので、portmaster apr –force-configでaprをリビルド。その後、改めてportmaster apache24 –force-configしたら無事ビルドも通って問題なく起動した。

FreeBSDにConnectXのユーティリティを入れるとファイル所有者が書き換えられる?

FreeBSD 12.0-RELEASEへの更新作業時に発覚した、システム系ディレクトリの所有者が謎の6151に書き換わってる問題の続き。

こんな感じでユーザーデータ置き場以外でroot以外が所有者のディレクトリを列挙してみた。

# find / -type d ! -uid 0 ! -path "*/home/*" ! -path "*/zdata/*" ! -path "*/zbackup/*" -print0 | xargs -0 stat -f "%u %g %N" | tee ~/non_root_owner_dirs.txt

すると、以下のディレクトリの所有者が6151になっていた。

6151 0 /etc
6151 0 /etc/mft
6151 0 /etc/mft/fwtrace_cfg
6151 0 /usr
6151 0 /usr/bin
6151 0 /usr/include
6151 0 /usr/lib
6151 0 /usr/lib/bash_libs
6151 0 /usr/lib/mft
6151 0 /usr/lib/mft/mtcr_plugins
6151 0 /usr/lib/mft/python_tools
6151 0 /usr/lib/mft/python_tools/mlxmcg
6151 0 /usr/lib/mft/python_tools/mst
6151 0 /usr/lib/mft/python_tools/mstdump
6151 0 /usr/lib/mft/tcl
6151 0 /usr/lib/mft/tcl/bin
6151 0 /usr/lib/mft/tcl/lib
6151 0 /usr/lib/mft/tcl/lib/tcl8.4
6151 0 /usr/share
6151 0 /usr/share/man
6151 0 /usr/share/man/man1
6151 0 /usr/share/mft
6151 0 /usr/share/mft/mlxconfig_dbs
6151 0 /usr/share/mft/mstdump_dbs

これらディレクトリの中を覗いてみると、いくつかのファイルも6151になっている。そして6151のやつらの大半の最終更新日が2018年11月23日だった。

書き換わってるファイル達と更新日から察するに、どうもConnectX-3のユーティリティのインストールが原因のような気がする。頼むよMellanoxさん…。

幸い、6151以外に怪しい所有者は見当たらなかったので、以下のコマンドで所有者をrootに戻して一件落着(元の所有者が本当にrootだったかどうかの確証はないけど…)

# find / -uid 6151 ! -path "*/home/*" ! -path "*/zdata/*" ! -path "*/zbackup/*" -print0 | xargs -0 chown root

FreeBSD 12.0-RELEASEのデフォルトのPerlをPerl 5.28に直す

FreeBSD 12.0-RELEASEに更新後、Samba 4.8を更新しようとしたら怒られた。

# portmaster samba48

===>>> Currently installed version: samba48-4.8.5_1
===>>> Port directory: /usr/ports/net/samba48

        ===>>> This port is marked IGNORE
        ===>>> Invalid perl5 version 5.24


        ===>>> If you are sure you can build it, remove the
               IGNORE line in the Makefile and try again.

Perl 5.24は不適切とな。例によって

/usr/ports/UPDATING

を見てみると、システムデフォルトのPerlバージョンは5.26 (20180330)を経て今は5.28(20181213)となっている模様。

20161103の記述に従い、Perlのバージョンを更新する。

まずは/etc/make.confDEFAULT_VERSIONS+= perl5=5.28を追加。

# echo 'DEFAULT_VERSIONS+=  perl5=5.28' >> /etc/make.conf

Perl 5.24を5.28で置き換える。

# portmaster -o lang/perl5.28 lang/perl5.24

正常に終了したら、上記DEFAULT_VERSIONSは消しておk。

そののち、Perl 5.24の共有ライブラリに依存するパッケージを更新。

# portmaster -f `pkg shlib -qR libperl.so.5.24`

p5-なパッケージも更新しといた方が安全かも?

# portmaster p5-

これで無事Samba 4.8のビルドが通った。

FreeBSD 11.2-RELEASEをFreeBSD 12.0-RELEASEに更新

遅ればせながら家鯖をFreeBSD 11.2-RELEASEから12.0-RELEASEへと更新した。

まずは現在の環境を最新にしておく(あまりに古いとメジャーバージョンアップに失敗することがあるため)

$ freebsd-version -ku
11.2-RELEASE-p7
11.2-RELEASE-p7

# freebsd-update fetch
# freebsd-update install
# reboot

ここで、ブートローダまでは起動するがカーネル読み込みでブラックスクリーンになる謎現象に2日ほど悩まされた。結局BIOS設定をデフォルト状態に戻したら直ったが、原因は恐らくデュアルCPUからシングルCPUに変えた事と思われる。うちの鯖は無駄にデュアルCPUだったので(ドヤァ

最新になったか確認。

$ freebsd-version -uk
11.2-RELEASE-p10
11.2-RELEASE-p10

12.0-RELEASEへ更新する。 </code> # freebsd-update -r 12.0-RELEASE upgrade Looking up update.FreeBSD.org mirrors… 3 mirrors found. Fetching metadata signature for 11.2-RELEASE from update2.freebsd.org… done. (略) To install the downloaded upgrades, run “/usr/sbin/freebsd-update install”. </code>

システムのインストール

# freebsd-update install
Installing updates...
Kernel updates have been installed.  Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.

「再起動して再度freebsd-update installせよ」とのことだが、ここで必ずサードパーティのkext(vboxdrvとか)を一旦無効化する。さもないと、再起動後のカーネル読み込みでクラッシュする場合がある。

# emacs /boot/loader.conf
hogehoge_load="YES"の行をコメントアウトするで~

再起動

# reboot

システムのバージョンを確認してみる。システムは更新され、ユーザーランドは古いままという事が分かる。

$ freebsd-version -ku
12.0-RELEASE-p4
11.2-RELEASE-p10

ユーザーランドを更新。procの所有権を変えようとしてエラーが出てるけど、まぁ気にしない。

# freebsd-update install
Installing updates...install: chown 0:0 ///proc: Operation not supported
install: chmod 555 ///proc: Operation not supported

Completing this upgrade requires removing old shared object files.
Please rebuild all installed 3rd party software (e.g., programs
installed from the ports tree) and then run "/usr/sbin/freebsd-update install"
again to finish installing updates.

再度システムのバージョンを確認。ユーザーランドが更新されていることが分かる。

$ freebsd-version -uk
12.0-RELEASE-p4
12.0-RELEASE-p5

ここまで来たら、pkg-static upgrade -fでインストール済みpackagesをすべて更新するのが正しいお作法。

なんだけれども、自分はportsでビルドしていく派なのでpkgだけ更新して、残りはちまちまportmasterする。

# pkg-static install -f pkg
pkg-static: Warning: Major OS version upgrade detected.  Running "pkg-static install -f pkg" recommended
Updating FreeBSD repository catalogue...
pkg-static: Repository FreeBSD has a wrong packagesite, need to re-create database
Fetching meta.txz: 100%    944 B   0.9kB/s    00:01
Fetching packagesite.txz: 100%    6 MiB   1.7MB/s    00:04
Processing entries: 100%
FreeBSD repository update completed. 31778 packages processed.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):

Installed packages to be REINSTALLED:
        pkg-1.10.5_5 (ABI changed: 'freebsd:11:x86:64' -> 'freebsd:12:x86:64')

Number of packages to be reinstalled: 1

3 MiB to be downloaded.

Proceed with this action? [y/N]: y
[1/1] Fetching pkg-1.10.5_5.txz: 100%    3 MiB   1.7MB/s    00:02
Checking integrity... done (0 conflicting)
[1/1] Reinstalling pkg-1.10.5_5...
[1/1] Extracting pkg-1.10.5_5: 100%
ldconfig: /usr/lib: ignoring directory not owned by root

んん~?/usr/libのオーナーがrootじゃないだとー?

$ ls -al /usr
total 177
drwxr-xr-x  18 6151  wheel   17 11月 23  2018 .
drwxr-xr-x  25 root  wheel   34  5月 29 01:20 ..
dr-xr-xr-x+  3 root  wheel    3 10月 19  2011 .zfs
drwxr-xr-x   2 6151  wheel  515  5月 29 00:39 bin
drwxr-xr-x   2 root  wheel    5  1月 29  2017 freebsd-dist
drwxr-xr-x  16 root  wheel   15 10月 22  2018 home
drwxr-xr-x  58 6151  wheel  344  5月 29 00:33 include
drwxr-xr-x  12 6151  wheel  710  5月 29 00:49 lib
drwxr-xr-x   5 root  wheel  720  5月 29 00:39 lib32
drwxr-xr-x   5 root  wheel    5  5月 29 00:49 libdata
drwxr-xr-x   9 root  wheel   68  5月 29 00:39 libexec
drwxr-xr-x  19 root  wheel   19 11月 15  2018 local
drwxr-xr-x   3 root  wheel    3  7月 13  2017 obj
drwxr-xr-x  72 root  wheel   92  5月 29 07:49 ports
drwxr-xr-x   2 root  wheel  305  5月 29 00:39 sbin
drwxr-xr-x  30 6151  wheel   30  5月 29 00:49 share
drwxr-xr-x  26 root  wheel   40  5月 29 00:34 src
drwxr-xr-x  15 root  wheel   18  7月 13  2017 tests

6151って誰だよ…。最早FreeBSD更新とは無関係になってきたので、続きは別記事で。

  • start.txt
  • 最終更新: 2022-07-27 15:26
  • by Decomo