iOS & iPad OS 15

Mac では Safari 15 がリリースされていますが、iPhone と iPad ではそれぞれ iOS 15 と iPadOS 15 も同時にリリースされています。

Safari 15 での WebClass 動作状況は先日に以下で紹介しました。

https://webclass.jp/blog/2021/09/29/safari-15/

ここでは iOS と iPad OS 15 にフォーカスします。

Release notes

ユーザ向けリリースノートは以下です

開発者向けの情報は以下です

ピックアップ

WebClass はWebのシステムなため、OSの機能をフルには使いません。ですが、現実的には iCloud の機能はレポートなどファイルの準備とアップロードに関係しますし、Notes や Apple Pencil あたりはメモをとったりする使い方に影響があります。

いくつか気になる変更をピックアップしました。

集中モード

集中モードというのが追加されています。睡眠中や仕事中などのいくつかのモードを定義でき、それぞれのモードではどのアプリからの通知だけ許可するか、誰からの通知だけ許可するか、など設定できます。

Wifi とかの設定の画面にFocusモードの枠が加わっています。


DoNotDisturb は私は解除し忘れたりするので時刻設定して自動でON/OFFしてもらえる機能は助かります。Sleep モードについては 寝る時間と起きる時間を設定していると反映してくれます。仕事などの日中の集中モードも、時刻と場所(位置情報)および使っているアプリで自動的に発動するようにできます。

大学生だと、授業中にサークルのLINEグループが盛り上がってて通知うるさい、みたいなのに対応できるんでしょうか。

ウィジェット(iPadOS)

私は Android も使っていて、ホームスクリーンのウィジェットもしばらく使っていました。ウィジェットの使い勝手はアプリと自分の使い方に依存するところが多く、最近はむしろ使わなくなりました。と思ったら、iPadOS に実装されたみたいです。

マルチタスクとクイックメモ(iPadOS)

iPad OSではマルチタスクのための操作体系が拡張されたようです。

ブラウザとノートを半々に開いて、調べたメモをノートにコピーしていくことができました。分割具合を調整したりするのはどうしても指だと不器用な感じが出ますが、全画面アプリ切り替えるよりはいいかなと思いました。

クイックメモは Chrome ではうまくいきませんでしたが、Safari でテキストを選択するとクイックノートのメニューが出てきました。メモ画面は画面を区切らず浮かせて表示できます。メモをとるのは標準アプリのNotes ですが、他のアプリに差し替えたりできないですかね。

まとめ

特に iPad は、個人的に注目しています。アルバイトの学生に話を聞いてみると、授業のノートを取るのに使っている学生もでてきているようです。話を聞いた子もそうでした。ノートを分けないので「あの科目のノート持ってくるの忘れた」も起きず、板書も記号や図、数式などそのまま書き着込めます。PDF の資料も取り込んで、その上から書き込みとかもできます。研究室配属されている子も、すでに論文を上でいちいち印刷することは無くなってきているようで、iPad 等で読みながらその上に線引いたりしているようです。

私も英語の勉強をするのに iPad + Apple Pencil を使うようになりました。ノートはワープロで取りにくいのは以前からわかっていましたが、ノートアプリにペンで手書きを実際にやってみると記入位置を入れ替えたりして途中に追加で書き込むスペースを作ったりもできて、便利です。文字は自動認識させずに、手書き文字のまま書いています。

引き続き、今の学生がどんなふうに勉強しているのか、できてしまうのか、ウォッチしていきたいと思います。

Safari 15

Safari 15 がリリースされました。

大きな変更点としては、UI、特にタブ周りですね。タブのグルーピングなど大胆に変更しており、まず使い慣れる必要がありそう。

あとは、iCloud キーチェーンとの連携強化などがあります。

WebClassに関係のある変更

テストや資料教材に PDF をとりこんで画面表示する際、ごく一部の PDF では、ページの途中でロードが止まってしまう問題を確認しています。PDF を表示するために使用している PDF.js と Safari 新バージョンの相性が悪いようで、この組み合わせでのみ問題が起こります。問題の解消には Safari の更新を待たないといけないかもしれません。続報があり次第このページを更新します。

--- 2021/11/4 追記 ---
Safari 15.1 がリリースされましたが、状況に変わりありません。PDF.js に関係ありそうな Issue がありましたが、Safari 側の問題として Close されました。
--- 2021/12/9 追記 ---
Safari Technology Preview Release 136 (Safari 15.4) で、ロードが止まってしまう問題が解消していることを確認しました。Stable Safari でもじき解決しそうです。
--- 2022/3/17 追記 ---
Safari 15.4 がリリースされました。PDF表示中にロードが止まってしまう問題が解消していることを確認しました。
--- 追記ここまで ---

また、Redesigned form controls in iOS. とあるので、念のため iPhone でテスト回答まわりを動作確認しましたが、問題ありませんでした。

最後に

その他ブラウザのリリース情報はこちらにまとめています。

Apache mpm_prefork と PHP-FPM の効率の違い

こんにちは。福岡です。

Apache mpm_prefork + mod_php と mpm_event + PHP-FPM を使ったときの、同時アクセス数が増えたときの効率を調査しましたので紹介します。

WebClass はWebサーバにApacheと、スクリプトに PHP を用いています。同時多数のアクセスを扱うためのチューニングは常に問題です。同時多数のアクセスに立ち向かうため、Apache は今では mpm_event をデフォルトとしていますし、PHP も PHP-FPM を使うことで mpm_event と組み合わせることができます。PHP-FPM も正式機能になって10年経つので、すでに利用されている環境もかなりあると思います。

ネットの記事などを読んで MPM_EventとPHP-FPM が仕組みとして mpm_prefork より効率が良さそうだというのはわかっていたのですが、定量的にどこがどれくらい良いのか、いまいちしっくりくる説明を見たことがありませんでした。なので、今更かもしれませんが、測ってみました。

ここでは具体的に、以下について調査しました。

  • 同じ同時アクセスを受けた時、mpm_prefork とくらべて、PHP-FPM はどれくらい効率的に、もしくは安定してリクエストを処理できるか
  • プロセスの立ち上げ速度に差はあるか

結果は以下でした。

  • 用意したPHPのプロセス数よりも多くの同時アクセスを受けている時には PHP-FPM のほうがレスポンスタイムを1/2倍にするくらい効率が良いことが分かりました。
  • プロセスを立ち上げる速度は Kernel や CPU 等の影響が大きく差がありませんでしたが、一気に同時アクセスを受けてからプロセスを立ち上げ始める初動では PHP-FPM のほうが良い動きでした。

ベンチマークに使う PHP プログラム

ベンチマークコマンドは以下のようにして単一URLに ab コマンドで同時アクセスをかけ、レスポンス時間を確認しました。

ab -c 300 -n 1000 http://10.0.0.104/webclass/wait1.php

アクセス先PHPプログラム wait1.php は、1±0.25 [s] だけ待って 'OK' の文字を返します。想定として、プログラムファイルはキャッシュメモリ上に乗っていてIO負荷が殆どかからない、PHPのスクリプトとしても処理はDBサーバからの結果を待つだけでほとんどやることがない状況を想定しています。

<?php
function msleep($milliseconds) {
    return usleep($milliseconds * 1000); 
}
$interval = 1000;
$var = 500; 
msleep(1000 + (rand(0, $var)-$var/2));

echo 'OK';

したがって、スクリプトの処理時間はCPUの負荷状況に影響を受けにくく、CPUが空いていても1秒より早く応答は返さないし、CPUに多少負荷がかかっていてもスクリプトの処理自体はあまり時間が延びません。

このプログラムに対するアクセスのレスポンス時間を計測し、どれだけ1sから離れるかを比較することで、Apache と PHP-FPM の効率だけを比較・評価できると考えました。

計測環境

AWS EC2 インスタンス(m4.large) でDebian 10 + WebClass 11.11.3 を構築しました。

  • CPU Intel® Xeon CPU E5-2686 v4 @ 2.30GHz x2
  • Mem 8G + Swap File 3G
  • Debian 10.9
    • Apache 2.4.38 (Debian)
    • PHP 7.3.29-1~deb10u1

同一VPC内に m4.large のDebian10インスタンスを構築し、http プロトコルで ab コマンドによるベンチマークを計測しました。

  • CPU Intel® Xeon CPU E5-2686 v4 @ 2.30GHz x2
  • Mem 8G
  • Debian 10.9
  • Ab 2.3 Rev.1843412

計測中にはどちらのサーバでも Swap と Hardware Interrupt(Steal)が発生しないのを確認してあります。

計測環境チェック

wait1.php はほぼ待つだけなので、同時アクセスが多数発生してもCPUはあまり消費せず、ApacheとPHPの同時アクセス・複数プロセスのマネジメントの効率が良いほど応答時間は1sに近づくはず、という前提を確認します。

この前提条件の確認のため、mpm_prefork とphp7.3-fpm のそれぞれについて、300 プロセス用意した状態で100同時アクセスをかけて応答時間が1s程度になることをチェックしておきました。

ab -c 100 -n  10000 http://10.0.0.104/webclass/wait1.php

MPM_Prefork + Mod_php 7.3 (MaxRequestWorkers=300 ) の結果

Mpm_prefork のケースでは、Apache のMPM設定は以下のようにしました。

StartServers   300
MinSpareServers 300
MaxSpareServers 300
MaxRequestWorkers 300
ServerLimit    300

abコマンドの結果は以下です。

Concurrency Level:      100
Time taken for tests:   101.782 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      2260000 bytes
HTML transferred:       20000 bytes
Requests per second:    98.25 [#/sec] (mean)
Time per request:       1017.816 [ms] (mean)
Time per request:       10.178 [ms] (mean, across all concurrent requests)
Transfer rate:          21.68 [Kbytes/sec] received

応答時間が1sで、CPU負荷もほとんどかからなかったため、問題なさそうです。

MPM_event + php7.3-fpm (max_children=300 ) の結果

Mpm_event のケースでは、Apache のMPM設定は以下のようにしました。スレッドを100ずつ増やしていき、上限も2000にしてあるので、プロセスの起動とスレッド上限があまり影響しないようにしています。

StartServers      2
MinSpareServers 100
MaxSpareServers 100
ThreadLimit        300
ThreadsPerChild  100
MaxRequestWorkers 2000

PHP-FPM のプロセスモードは以下の設定です。

pm = dynamic
pm.max_children = 300
pm.start_servers = 50
pm.min_spare_servers = 20
pm.max_spare_serves = 50

なお、この設定は Prefork に揃えるには static にすればよかったと後で気づきました。

abコマンドの結果は以下です。

Concurrency Level:      100
Time taken for tests:   103.935 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      2300000 bytes
HTML transferred:       20000 bytes
Requests per second:    96.21 [#/sec] (mean)
Time per request:       1039.351 [ms] (mean)
Time per request:       10.394 [ms] (mean, across all concurrent requests)
Transfer rate:          21.61 [Kbytes/sec] received

dynamic/static の点は気になりますが、一応は応答時間が1sで、CPU負荷もほとんどかからなかったため、問題なさそうです。

レスポンス時間の計測結果

Prefork と PHP-FPM のワーカ数上限と、同時アクセス数を変えながら ab コマンドでレスポンス時間をプロットしたのが以下です。

グラフの凡例の名前「Prefork」もしくは「PHP-FPM」の横に書いた数字が、それぞれに設定したワーカーの上限です。

wait1.php は1±0.25s 待つだけなので、同時アクセスが多数発生しても CPU に掛かる負荷はわずかでした。ですので、MPM と PHP-FPM の効率がレスポンスタイム1sよりどれくらい上に離れてくか、に反映されると考えられます。1sでフラットなグラフになるほど、同時アクセスが増えても効率が落ちないことを意味します。

MPM_Prefork は、用意したプロセス未満の同時アクセスに対しては非常に効率が良いです。しかし、プロセス数を超える同時アクセスに対しては、著しく効率が悪化し、ab はエラーを計上することもありました。MaxRequestWorkers 900 で同時アクセス1500のケースでもCPUの利用時間は大して増えませんが、Load Average は 9.3 ほどになりました。エラーを計上したところより上の同時アクセス数はデータを取っていません。

PHP-FPM はプロセス数未満の同時アクセスに対して効率が良いのはMPM_Preforkと変わりません。一方、同時アクセス数がプロセス数よりも増えた時は、MPM_Prefork よりもレスポンス時間を1/2 程度に保てました。Load Averageは1いくか行かないか程度で、CPU使用率は低いままです。

プロセス数が足りない方に寄った計測をしているため、どちらの方式でもプロセス数を増やすことによる効率の悪化の様子は観察できませんでした。ただし、実際の運用ではプロセス数が増えるとスクリプトによるCPU利用量も増えるため、プロセス管理の効率の問題以前にCPUがボトルネックになることも考えられます。

プロセスの立ち上がり速度の計測

MPM_Prefork も PHP-FPM もワーカとしてプロセスを立ち上げます。一般にプロセスのフォークは重い処理になります。また、待機しているワーカ数よりも多くの同時アクセスがワッと来た時の反応にも影響します。WebClassですと、10時半から2限では試験をします!というとき、授業の開始時刻で一斉に学生が操作し始めるので侮れないパラメータになります。

2つの環境のそれぞれに、ワーカの最大値を500に、初期待機ワーカ数を50にした状態で待機させ、ab コマンドで同時500アクセスをかけました。そこからプロセス数を1秒単位で数えていって、500に達したところまでをグラフにしています。

グラフの凡例の名前「PHP-FPM」の横に書いた数字は min_spaire_servers の値です。最初は10にして計測したところ著しくプロセス起動が遅かったので、50の結果を加えてPreforkと比べられるようにしています。なお、これ以上値を増やしても、もしくは同時アクセス数を増やしても、速度は変わりませんでした。

プロセスの立ち上げ速度(グラフの傾き)は MPM_PreforkとPHP-FPM50で差がありません。これは Kernel や CPU などのもっと下のレイヤーの性能によるものと思います。ですが、同時アクセスが急にきてからプロセスを増やし始める反応はPHP−FPMのほうが良く、500プロセス揃うまでの時間に3sの差が出ました。その結果、平均応答時間は初動の速いPHP-FPM のほうが短くなりました。

CPUへの負荷を見ると、MPM_Prefork はプロセス上限に至るまでは CPU も Load Averageも低いままですが、PHP-FPM のほうはCPU使用率と Load Average が Prefork よりも高くなりました。もしPHPにそれなりの処理が有る時、PHP-FPMのプロセスの立ち上げにどれくらい影響するかちょっと気になります。

まとめ

まずは基本的なところの違いを知りたいと思って、できるだけプロセス管理効率に的を絞った計測をしてみました。

MPM_Event については、PHP-FPMの計測でほぼ無視できるほどサクサクと1500同時リクエストなどを抱えてくれていて、数字では示せませんでしたが流石だなと思いました。そのおかげで、PHP-FPM はワーカ数を絞っていても効率的に処理できるようになっていると思います。PHPのプロセス数を絞ることができれば、接続先のDBのワーカ数も減らすことができます。コア数とメモリが限られる環境での安定性に繋がります。また、この安定性を保ったまま、CPU とメモリを増やした分だけワーカ数を増やしていければ、1台のプロセッサでカバーできる同時アクセス数も増やしやすいかもしれません。このあたり、今後詰めていきたいところです。

Firefox 92

Firefox 92 が 9 月 7 日にリリースされました。

Firefox 92 release note

以下のリンクに主な変更点の情報が記載されています。

https://www.mozilla.org/en-US/firefox/92.0/releasenotes/

https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/92

Pickup for WebClass

WebClass に影響ある変更はありませんでした。

気になる変更点

CSS accent-colorプロパティの追加

チェックボタンやラジオボタンを選択したときに表示されるアクセントカラーを指定できるようになりました。
Chrome93 でこの機能は実装されたのですが、今回の Firefox のアップデートはこれに追従する形で実装がされました。

MDN に掲載されている以下の使用例を参考にしてください。
https://developer.mozilla.org/en-US/docs/Web/CSS/accent-color

今後の Firefox リリースについて

次回のリリースは 10 月 5 日に予定されています。

Firefox Release Calendar

その他ブラウザのリリースはこちらにまとめています。

Debain 11 と unattended-upgrades

Debian 11 が8月にリリースされました。

PHP 7.4 + PostgreSQL 13 になっています。WebClass の対応状況は検証中ですが、構成はあまり変わっておらず、PHPもPostgreSQLも下位互換性のない変更はあまり無さそうです。

Debian 10 からですが、Install CD からインストールすときにパッケージの自動更新を有効にするかどうか聞かれます。このプログラムは unattended-upgrades といい、セキュリティアップデートなどを定期的にチェックして更新を適用します。

https://wiki.debian.org/UnattendedUpgrades

デスクトップ用途では便利かもしれませんが、サーバ用途ではサービスの再起動などがかかると夜に仕込んでいたバッチ処理に影響が出るなどするので、OFF にしています。

Install CDからインストールするとき確認画面で No を選択しているとパッケージもインストールされませんが、AWS 上のイメージを使ったときには最初から有効になっていたケースがありました。以下のコマンドで設定状況を確認して、もしあれば purge しています。

systemctl status unattended-upgrades
systemctl stop unattended-upgrades
systemctl disable unattended-upgrades
apt purge -y unattended-upgrades

Debian のaptコマンドは、インストールするときはプロセスを自動的に立ち上げてくれますが、remove/purge するときはプロセスを殺してくれません。なので、予めサービスを止めてしまいます。