ファスト・パスのサポート
厳密な通信パスの長さ要件を持つアプリケーションでは、z/OS® UNIX-to-TCP/IP スタック通信をさらに削減するために、ファスト・パス拡張が提供されています。この拡張は、Communications Server が提供する、UNIX System Services ソケット API、z/OS XL C/C++ ランタイム・ライブラリー関数、およびネイティブ MVS™ ソケット API (C/C++、EZASMI マクロ、EZASOKET、REXX、または CICS® ソケット API など) を用いるアプリケーションが使用できます。 これは、Pascal API を使用しているアプリケーションでは使用できません。
ファスト・パス・サポートを使用すると、以下のソケット・システム呼び出しの通信は削減されます。
- send()
- recv()
- sendto()
- recvfrom()
- sendmsg()
- recvmsg()
これらのパフォーマンス強化は、z/OS UNIX 非同期ソケット・インターフェース (BPX1AIO) の対応するソケット・システム呼び出しにも使用できます。
自動ファスト・パス・サポートには、活動化を必要とするファスト・パス・サポートにあるような制限事項はありません (ファスト・パス・サポートの活動化を参照してください)。 特に、自動ファスト・パスは POSIX シグナルをサポートします。
ファスト・パス・サポートの活動化
この機能は、z/OS UNIX 環境変数 _BPXK_INET_FASTPATH を使用することにより、z/OS UNIX プロセス全体に対して活動化できます。 この変数の値は、 ソケット・アプリケーションがファスト・パスとしてマークされた かどうかを判別します。XL C/C++ アプリケーションは、setenv 関数を使用することによってこの変数を設定できます。または、ソケット・アプリケーションが開始される前に z/OS UNIX シェル環境にこの変数をエクスポートすることができます。 z/OS UNIX API を使用するアプリケーションは、BPX1ENV サービスを使用してこの変数を設定できます。
_BPXK_INET_FASTPATH 環境変数を使用する場合、以下の制限が、UNIX System Services ソケット API または z/OS XL C/C++ ランタイム・ライブラリー関数を使用するアプリケーションに適用されます。
- アプリケーションは X/Open Portability Guides (XPG) に準拠しておらず、POSIX シグナルはサポートされていません。 アプリケーションは SIGKILL 終了シグナルでのみ割り込み可能です。
- 対話式 z/OS UNIX DBX デバッガーを使用してアプリケーションをデバッグすることはできません。 ただし、DBX デバッガーを使用して、環境変数を設定せずにアプリケーションを開発およびテストし、それから環境変数を設定して、アプリケーションを実動で実行できます。
共通 INET を使用しない環境では、この変数の値は、BPXPRMxx parmlib メンバー内の FILESYSTYPE ステートメントの TYPE パラメーターで指定された名前に設定します。
共通 INET 環境では、環境変数を設定するために使用される値は、アプリケーションが TCP または UDP プロトコルのいずれを使用しているかに応じて異なります。 共通 INET 環境で、変数を以下のように設定します。
- UDP アプリケーションではこれを、BPXPRMxx parmlib メンバー内の SUBFILESYSTYPE ステートメントの NAME パラメーターに指定されている、TCP/IP スタックの名前に設定します。
ソケット・アプリケーションは、環境変数に指定された TCP/IP スタック名に明示的に関連付けられます。
これは、ソケット・アプリケーションが、指定された TCP/IP スタック・インターフェースを介してのみ、アクセス可能なパートナーと通信できることを意味します。
UDP では、環境変数は共通 INET サポートをオーバーライドします。
UDP アプリケーションに対してファスト・パスをアクティブ化する前に、この件を考慮します。
規則: ファスト・パス・サポートと、特定の TCP/IP スタックに対するアフィニティーを必要とする UDP アプリケーションには、_BPXK_INET_FASTPATH 環境変数を使用する必要があります。 UDP アプリケーションが、_BPXK_SETIBMOPT_TRANSPORT 環境変数を設定したり、setibmopt() または BPX1PCT を使用したりするなどの他の手段を用いて、特定の TCP/IP スタックに対するアフィニティーを確立する場合は、ファスト・パス変数の設定は無視されます。
- TCP アプリケーションの場合、アスタリスク (*) に変数を設定すると、アプリケーションを共通 INET 構成の任意の TCP/IP スタックに関連付けることができます。
このメソッドにより、ファスト・パス・モデルをサポートするすべての TCP/IP スタックは、自動的にファスト・パスのパフォーマンスの利点を入手できます。
TCP サーバーは、それが環境変数に特定の TCP/IP スタックの名前を指定したとしても、特定の TCP/IP スタックにバインドされることはありません。その代わり、すべての TCP/IP スタックを経由して、インバウンド接続を listen することができます。
accept() 呼び出し時に、環境変数で名付けられている TCP/IP スタックから接続が到達すると、それは自動的にファスト・パスとしてマークされます。
現行の環境変数値によって名付けられていない TCP/IP スタックから到達した接続は、ファスト・パスとしてはマークされません。
ガイドライン: リゾルバー・サービス (gethostbyname()、gethostbyaddr()、 getaddrinfo()、getnameinfo())、およびネットワーク・インターフェース識別サービス (if_nameindex()、if_nametoindex()、if_indextoname()) などの特定 TCP/IP API は、その処理のために UDP ソケットを内部的に使用します。 特定の TCP/IP スタック名が環境変数に指定されている場合は、これらの隠れた UDP ソケットは、名前が付けられた TCP/IP スタックのみと関連付けされ、望ましくない影響を及ぼす場合があります。 例えば、結果としてドメイン・ネーム・サーバーとの通信を生じるリゾルバー API 照会は、指定された TCP/IP スタックの上でのみ現れます。そのため、TCP アプリケーションでは環境変数を特殊アスタリスク (*) 値に設定するのが最善です。 アプリケーションが特定の TCP/IP スタックに対するアフィニティーを必要としている場合、setibmopt() および BPX1PCT などの、z/OS UNIX が提供するいずれかの機能を使用して、それを行うことができます。 特定の TCP/IP スタックに対するアフィニティーの確立について詳しくは、「z/OS UNIX System Services 計画」を参照してください。
アプリケーションはまた、ソケットに対して Iocc#FastPath IOCTL を発行するか、あるいは w_ioctl() または BPX1IOC API を使用して、単一ソケットのファスト・パス処理を使用可能にできます。 この IOCTL は、既に特定 TCP/IP スタックと関連付けられているソケットに対して発行された場合にのみ有効です。 ソケットは、以下の条件のどれかに当てはまる場合、特定 TCP/IP スタックと関連付けされている と見なされます。
- アプリケーションが、_BPXK_SETIBMOPT_TRANSPORT 環境変数の設定、setibmopt()、BPX1PCT、または他の方式の使用により、特定 TCP/IP スタックとの明示的な処理のアフィニティーを持っている。
- TCP/IP スタック・アフィニティーが、SIOCSETRTTD IOCTL を使用して、このソケットに対して明示的に設定されている。
- bind() が既に、特定の IP アドレスが指定されて (IPv4 INADDR_ANY アドレスまたは IPv6 無指定アドレスの in6addr_any ではない)、ソケットに対して発行されている。
- 接続されるのが TCP ストリーム・ソケットである。これには accept() の結果として返される TCP ソケットと、connect() が発行されるソケットが含まれます。
Iocc#FastPath 定数は BPXYIOCC に定義されます。この IOCTL には、入力として 4 バイトの引数が必要です。 この引数には、特定のソケットのファスト・パスを活動化する場合はゼロ以外の値を、ファスト・パスを使用不可にする場合はゼロの値を設定します。