SAS Remote Services and the web application servers (Jboss, Oracle WebLogic, and IBM WebSphere) use the open–source JGroups framework to handle multicast communications. By default, JGroups uses the User Datagram Protocol (UDP) If you cannot use (or choose not to use) UDP,
you can use TCP as an alternative protocol. This note explains how to use TCP to reconfigure JGroups for SAS Remote Services and your web application server.
Reconfiguring JGroups for Remote Services
You need to add the following Java virtual machine (JVM) argument for Remote Services to the appropriate location (see below) for your operating environment:
-Dmulticast.config.file=file:///your-directory-path/protocolStackTcpOnly.xml
For Microsoft Windows Operating Environments
In the wrapper.conf file that resides in the SAS–configuration–directory\Lev1\Web\Applications\RemoteServices\wrapper.conf directory, add the JVM argument, as shown below:
wrapper.java.additional.13=-Dmulticast.config.file=file:///C:/SAS/config/Lev1/Web/Applications/RemoteServices/protocolStackTcpOnly.xml
For UNIX and Linux Operating Environments
In the RemoteSerices.sh file that resides in SAS–configuration–directory\Lev1\Web\Applications\RemoteServices\, add the JVM argument, as shown below. The JVM argument is highlighted in yellow.
start2)
"$JAVA_JRE_COMMAND" -Dsas.ext.config="/opt/sas93/install/sas.java.ext.config" \
-classpath "$CLASSPATH" \
-Djava.system.class.loader=com.sas.app.AppClassLoader -Dsas.app.launch.config="$MERGER_PICKLIST" \
-Dsas.app.repository.path="$SASVJR_REPOSITORYPATH" \
-Dsas.app.class.path="$REMOTESERVICESDIR" \
com.sas.framework.picklist.PicklistMerger \
-primary "$PRIMARY_PICKLIST" \
"$PICKLIST" \
"$SECONDARY_PICKLIST1" \
"$SECONDARY_PICKLIST2"
cd $REMOTESERVICESLOGSDIR
nohup "$JAVA_JRE_COMMAND" -Dsas.ext.config="/opt/sas93/install/sas.java.ext.config" \
-classpath "$CLASSPATH" \
-Dlog4j.configuration=file:////opt/sas93/config/Lev1/Web/Applications/RemoteServices/log4j.xml \
-Djava.system.class.loader=com.sas.app.AppClassLoader \
-Dsas.app.launch.config="$PICKLIST" \
-Dsas.app.repository.path="$SASVJR_REPOSITORYPATH" \
-Dsas.app.class.path="$REMOTESERVICESDIR" \
-Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false -Dmulticast_udp_ip_ttl=1 \
-Dsas.vjr.dir="$SASVJR_REPOSITORYPATH" -Dsas.lev.dir="$LEVEL_ROOT" -Dsas.home.dir="$SAS_HOME" \
-Dsas.services.information.types.path="/opt/sas93/install/SASPlatformObjectFramework/9.3/plugins" \
-Dsas.vm.identifier=Lev1:5091 \
-Dmulticast.config.file=file:////opt/sas93/Lev1/Web/Applications/RemoteServices/protocolStackTcpOnly.xml \
-Xms256m -Xmx256m -Xgcpolicy:gencon -Xdisableexplicitgc -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.awt.headless=true -Xss256k -Xmso256k -Xmn16m \
com.sas.framework.services.bootstrap.SASRemoteServices > \
$REMOTESERVICESLOGSDIR/RemoteServices_console.log 2>&1 &
Reconfiguring JGroups for Your Web Application Server
You need to add the following Java virtual machine (JVM) argument for your particular web application server:
-Dmulticast.config.file=file:///your-directory-path/protocolStackTcpOnly.xml
For the JBoss Web Application Server in Windows Operating Environments
In the wrapper.conf file that resides in JBoss–installation–directory\server\SASServerN\, add the argument, as shown below:
wrapper.java.additional.44=-Dmulticast.config.file=file:///C:/SAS/config/Lev1/Web/Applications/RemoteServices/protocolStackTcpOnly.xml
For the JBoss Web Application Server in UNIX and Linux Operating Environments
In the SASServer1.sh file that resides in JBoss–installation–directory\bin\, add the JVM argument as shown in the following example. You must scroll to the right to see the argument, which is highlighted in yellow:
JAVA_OPTS="-Xms1024m -Xmx3096m -XX:PermSize=768m -XX:MaxPermSize=768m -Xmso256k -Xgcpolicy:optavgpause -Xdisableexplicitgc -Xcompressedrefs -Xss256k -Djava.awt.headless=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dsas.scs.host=blues66.unx.sas.com -Dsas.scs.port=8080 -Dsas.container.identifier=jboss -Dcom.sas.services.logging.disableRemoteList=true -Dcom.sas.services.logging.disableRemoteLogging=true -Dcom.sas.log.config.ignoreContextClassLoader=true -Dsas.jms.authentication.decorator=false -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false -Dmulticast_udp_ip_ttl=1 -Dmulticast.address=239.36.3.24 -Dmulticast.port=8561 -Djava.security.policy="/opt/thirdparty/jboss/jboss-5.1.0.GA/server/SASServer1/conf/sas.all.permissions.policy" -Djboss.home.dir="/opt/thirdparty/jboss/jboss-5.1.0.GA" -Djboss.server.home.dir="/opt/thirdparty/jboss/jboss-5.1.0.GA/server/SASServer1" -Dsas.deploy.dir="/opt/thirdparty/jboss/jboss-5.1.0.GA/server/SASServer1/deploy_sas" -Dsas.auto.publish.port=8080 -Dmulticast.config.file=file:////opt/sas93/Lev1/Web/Applications/RemoteServices/protocolStackTcpOnly.xml -Dcom.sas.log.config.url=file:///opt/sas93/config/Lev1/Web/Common/LogConfig/"
Important Notes
If SAS Remote Services is configured on the middle-tier (it is, by default), there should be only one protocolStackTcpOnly.xml file, and both JVM arguments can point to the same file. However, if you have multiple web application servers or if Remote Services is configured on another server, you need to have a separate protocolStackTcpOnly.xml file for each JVM. As a result, the paths in the JVM arguments will be different.
Contents of the protocolStackTcpOnly.xml File for One Server or When SAS Remote Services Is on the Middle Tier
<!--
Compute tier TCP stack. This is a pure TCP stack that does not use a gossip router.
-->
<config>
<TCP start_port="7800" loopback="false" bind_addr="localhost" />
<TCPPING initial_hosts="localhost[7800]" />
<MERGE2
max_interval="20000"
min_interval="5000"
down_thread="false"
up_thread="false" />
<FD_SOCK down_thread="false" up_thread="false" />
<FD timeout="2500" max_tries="4" down_thread="false" up_thread="false" />
<VERIFY_SUSPECT timeout="2000" down_thread="false" up_thread="false" />
<pbcast.NAKACK retransmit_timeout="600,1200,2400,4800"
down_thread="false" up_thread="false"/>
<pbcast.STABLE down_thread="false" up_thread="false" />
<pbcast.GMS join_timeout="5000" join_retry_timeout="2000" leave_timeout="5000" digest_timeout="5000" merge_timeout="10000" down_thread="false" up_thread="false"/>
<FC
max_credits="200000"
min_threshold="0.10"
down_thread="false"
up_thread="false" />
<pbcast.STATE_TRANSFER down_thread="false" up_thread="false" />
<!-- pbcast.FLUSH down_thread="false" up_thread="false"/-->
</config>
Note: In this file [7800] in the line <TCPPING initial_hosts="localhost[7800]" /> specifies the port number that is to be used. You can specify ny unused TCP port on the systems.
Contents of the protocolStackTcpOnly.xml File for Multiple Servers or When SAS Remote Services Is On Another Server
When you have multiple web application servers or when Remote Services is configured on another server, you need to ensure that the <TCPPING initial_hosts=". . .> value reflects each of the unique server[port] combinations, as shown in the following example where SAS Remote Services is installed on the MachineA, and JBoss is horizontally clustered on MachineB and MachineC. As a result, you have three protocolStackTcpOnly.xml Files, as shown below:
MachineA protocolStackTcpOnly.xml
<!--
Compute tier TCP stack. This is a pure TCP stack that does not use a gossip router
-->
<config>
<TCP start_port="7800" loopback="false" bind_addr=" MachineA" />
<TCPPING initial_hosts="MachineA[7800], MachineB[7800], MachineC[7800]" />
<MERGE2
max_interval="20000"
min_interval="5000"
down_thread="false"
up_thread="false" />
<FD_SOCK down_thread="false" up_thread="false" />
<FD timeout="2500" max_tries="4" down_thread="false" up_thread="false" />
<VERIFY_SUSPECT timeout="2000" down_thread="false" up_thread="false" />
<pbcast.NAKACK retransmit_timeout="600,1200,2400,4800"
down_thread="false" up_thread="false"/>
<pbcast.STABLE down_thread="false" up_thread="false" />
<pbcast.GMS join_timeout="5000" join_retry_timeout="2000" leave_timeout="5000" digest_timeout="5000" merge_timeout="10000" down_thread="false" up_thread="false"/>
<FC
max_credits="200000"
min_threshold="0.10"
down_thread="false"
up_thread="false" />
<pbcast.STATE_TRANSFER down_thread="false" up_thread="false" />
<!-- pbcast.FLUSH down_thread="false" up_thread="false"/-->
</config>
MachineB protocolStackTcpOnly.xml
<!--
Compute tier TCP stack. This is a pure TCP stack that does not use a gossip router
-->
<config>
<TCP start_port="7800" loopback="false" bind_addr=" MachineB" />
<TCPPING initial_hosts="MachineA[7800], MachineB[7800], MachineC[7800]" />
<MERGE2
max_interval="20000"
min_interval="5000"
down_thread="false"
up_thread="false" />
<FD_SOCK down_thread="false" up_thread="false" />
<FD timeout="2500" max_tries="4" down_thread="false" up_thread="false" />
<VERIFY_SUSPECT timeout="2000" down_thread="false" up_thread="false" />
<pbcast.NAKACK retransmit_timeout="600,1200,2400,4800"
down_thread="false" up_thread="false"/>
<pbcast.STABLE down_thread="false" up_thread="false" />
<pbcast.GMS join_timeout="5000" join_retry_timeout="2000" leave_timeout="5000" digest_timeout="5000" merge_timeout="10000" down_thread="false" up_thread="false"/>
<FC
max_credits="200000"
min_threshold="0.10"
down_thread="false"
up_thread="false" />
<pbcast.STATE_TRANSFER down_thread="false" up_thread="false" />
<!-- pbcast.FLUSH down_thread="false" up_thread="false"/-->
</config>
MachineC protocolStackTcpOnly.xml
<!--
Compute tier TCP stack. This is a pure TCP stack that does not use a gossip router
-->
<config>
<TCP start_port="7800" loopback="false" bind_addr=" MachineC" />
<TCPPING initial_hosts="MachineA[7800], MachineB[7800], MachineC[7800]" />
<MERGE2
max_interval="20000"
min_interval="5000"
down_thread="false"
up_thread="false" />
<FD_SOCK down_thread="false" up_thread="false" />
<FD timeout="2500" max_tries="4" down_thread="false" up_thread="false" />
<VERIFY_SUSPECT timeout="2000" down_thread="false" up_thread="false" />
<pbcast.NAKACK retransmit_timeout="600,1200,2400,4800"
down_thread="false" up_thread="false"/>
<pbcast.STABLE down_thread="false" up_thread="false" />
<pbcast.GMS join_timeout="5000" join_retry_timeout="2000" leave_timeout="5000" digest_timeout="5000" merge_timeout="10000" down_thread="false" up_thread="false"/>
<FC
max_credits="200000"
min_threshold="0.10"
down_thread="false"
up_thread="false" />
<pbcast.STATE_TRANSFER down_thread="false" up_thread="false" />
<!-- pbcast.FLUSH down_thread="false" up_thread="false"/-->
</config>
Operating System and Release Information
SAS System | SAS Enterprise BI Server | z/OS | | |
Microsoft® Windows® for 64-Bit Itanium-based Systems | | |
Microsoft Windows Server 2003 Datacenter 64-bit Edition | | |
Microsoft Windows Server 2003 Enterprise 64-bit Edition | | |
Microsoft Windows XP 64-bit Edition | | |
Microsoft® Windows® for x64 | | |
Microsoft Windows 8 Enterprise 32-bit | | |
Microsoft Windows 8 Enterprise x64 | | |
Microsoft Windows 8 Pro 32-bit | | |
Microsoft Windows 8 Pro x64 | | |
Microsoft Windows 8.1 Enterprise 32-bit | | |
Microsoft Windows 8.1 Enterprise x64 | | |
Microsoft Windows 8.1 Pro | | |
Microsoft Windows 8.1 Pro 32-bit | | |
Microsoft Windows 95/98 | | |
Microsoft Windows 2000 Advanced Server | | |
Microsoft Windows 2000 Datacenter Server | | |
Microsoft Windows 2000 Server | | |
Microsoft Windows 2000 Professional | | |
Microsoft Windows NT Workstation | | |
Microsoft Windows Server 2003 Datacenter Edition | | |
Microsoft Windows Server 2003 Enterprise Edition | | |
Microsoft Windows Server 2003 Standard Edition | | |
Microsoft Windows Server 2003 for x64 | | |
Microsoft Windows Server 2008 | | |
Microsoft Windows Server 2008 R2 | | |
Microsoft Windows Server 2008 for x64 | | |
Microsoft Windows Server 2012 Datacenter | | |
Microsoft Windows Server 2012 R2 Datacenter | | |
Microsoft Windows Server 2012 R2 Std | | |
Microsoft Windows Server 2012 Std | | |
Microsoft Windows XP Professional | | |
Windows 7 Enterprise 32 bit | | |
Windows 7 Enterprise x64 | | |
Windows 7 Home Premium 32 bit | | |
Windows 7 Home Premium x64 | | |
Windows 7 Professional 32 bit | | |
Windows 7 Professional x64 | | |
Windows 7 Ultimate 32 bit | | |
Windows 7 Ultimate x64 | | |
Windows Millennium Edition (Me) | | |
Windows Vista | | |
Windows Vista for x64 | | |
64-bit Enabled AIX | | |
64-bit Enabled HP-UX | | |
64-bit Enabled Solaris | | |
HP-UX IPF | | |
Linux | | |
Linux for x64 | | |
Linux on Itanium | | |
Solaris for x64 | | |
*
For software releases that are not yet generally available, the Fixed
Release is the software release in which the problem is planned to be
fixed.